Autor Beitrag
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Do 20.01.11 10:20 
Moin,

ich verbrenne mir gerade das erste mal die Finger an einem Mousehook. Ich möchte einen lokalen Hook haben:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
var Hook : Cardinal = 0;
function HookProc(nCode: Integer; MsgID: WParam; Data: LParam): LResult;

type
  TForm4 = class(TForm)
    mmo1: TMemo;
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form4: TForm4;

implementation

{$R *.dfm}

procedure TForm4.FormCreate(Sender: TObject);
begin
  Hook:=SetWindowsHookEx(WH_MOUSE,@HookProc,0,GetCurrentThreadID );
end;

procedure TForm4.FormDestroy(Sender: TObject);
begin

  UnhookWindowsHookEx(Hook);
  Hook:=0;

end;

procedure TForm4.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  mmo1.Lines.Add('MouseMove');
end;

function HookProc(nCode: Integer; MsgID: WParam; Data: LParam): LResult;
begin
    if nCode < HC_ACTION then begin
       Result := CallNextHookEx(Hook, nCode, MsgID, Data);
       Exit;
    end
    else if nCode = HC_ACTION then
    begin
      Form4.mmo1.Lines.Add('MouseHook');
    end;

    Result := CallNextHookEx(Hook,nCode,MsgID,Data) ;

end;


Das funktioniert auch teilweise. Allerdings tritt nach ein paar Sekunden eine Access Violation auf. Ich hab irgendwie überhaupt keine Idee, wo die Violation ausgelöst wird, und was der Grund dafür ist.
Wäre toll wenn ihr mir helfen könntet.

Danke!
Jens

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1335
Erhaltene Danke: 118

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Do 20.01.11 15:23 
Versuch es mal mit MadExcept.
Ansonsten, ich vermute das die HookProc in ein anderen Thread läuft. Du solltest also auf dein Form Synchonized zugreifen oder ne Message senden die du auswertest um den Text zu schreiben.
Zudem ist deine HookProc etwas umständlich.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
function HookProc(nCode: Integer; MsgID: WParam; Data: LParam): LResult;
begin
  if nCode = HC_ACTION then
  begin
    Form4.mmo1.Lines.Add('MouseHook'); // an der stelle sollte es immer mal knallen
  end;
  Result := CallNextHookEx(Hook, nCode, MsgID, Data) ;
end;

So sollte es eigentlich reichen, denn CallNextHookEx wird ja in jedem Fall aufgerufen.

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
Nersgatt Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Fr 21.01.11 08:06 
Danke für die Antwort. Leider komm ich so auch nicht weiter. Ich hab mir jetzt ein User-Message gemacht und schicke der Form mit SendMessage diese Message in der HookProc. Trotzdem kommt es noch zu der AccessViolation.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1335
Erhaltene Danke: 118

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Fr 21.01.11 12:15 
Hm, hast du mal MadExcept installiert und es damit mal laufen lassen? MadExcept zeigt dir recht genau an wo es geknallt hat.
Nimm statt SendMessage mal PostMessage das entkoppelt den Nachrichtenversand noch ein bisschen mehr.

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
Nersgatt Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Fr 21.01.11 12:22 
Mit PostMessage ging es auch nicht. Mit MadExept muss ich mich erst mal befassen.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Fr 21.01.11 12:39 
In einem MessageHook die MessageQueue verändern ist vielleicht auch nicht so die Idee des Tages...

Die richtige Calling Convention hast du aber, oder? Ich hab das grade mal ausprobiert, hier funktionierts wunderbar (auch wenn ich mysteriöse MouseMoves bekomme, ohne dass ich was angefasst hätte).
ausblenden Delphi-Quelltext
1:
function HookProc(nCode: Integer; MsgID: WParam; Data: LParam): LResult; stdcallforward;					
Einloggen, um Attachments anzusehen!
_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
Nersgatt Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Fr 21.01.11 12:42 
user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Die richtige Calling Convention hast du aber, oder?

Ne, das war es! :zustimm:
Dankeschön!

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)