| Autor |
Beitrag |
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: 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:
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 public 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
      
Beiträge: 1335
Erhaltene Danke: 118
Win 10
RIO, CE, Lazarus
|
Verfasst: 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.
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'); 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 
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: 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
      
Beiträge: 1335
Erhaltene Danke: 118
Win 10
RIO, CE, Lazarus
|
Verfasst: 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 
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: 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
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: 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).
Delphi-Quelltext 1:
| function HookProc(nCode: Integer; MsgID: WParam; Data: LParam): LResult; stdcall; forward; |
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 
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Fr 21.01.11 12:42
Martok hat folgendes geschrieben : | | Die richtige Calling Convention hast du aber, oder? |
Ne, das war es!
Dankeschön!
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
|