Entwickler-Ecke
Windows API - Problem mit Maus-Hook
Ruditschka - Do 15.05.03 13:23
Titel: Problem mit Maus-Hook
Hallo zusammen!
Ich habe ein bis zwei Probleme mit meinem Maus-Hook.
Hier erst mal der Code, damit jeder weiß, worum es geht:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| function MouseHookProc(nCode: Integer; wPara: WPARAM; lPara: LPARAM): LRESULT; stdcall; begin Result := CallNextHookEx(HookHandle, nCode, wPara, lPara); If nCode = hc_Action then begin If wPara = WM_LBUTTONDOWN then begin ShowMessage('Sende Nachricht.......'); PostMessage(WindowHandle, WM_MOUSEHOOKMSG, 0, 0); end; end; end; |
Die Variable WindowHandle wird beim Starten übergeben und ist Application.Handle meiner Anwendung.
Jetzt meine Probleme:
- Der Hook meldet sich bei brav bei jedem Mausklick mit "Sende Nachricht...", soch nur bei einem Klick innerhalb meiner Anwendung kommt auch eine Nachricht bei mir an.
- Sobald ich außerhalb meiner Anwendung klicke, wird der Hook direkt 16 mal aktiv.
Hat einer eine Lösung für zumindest eines der Probleme parat?
Gruß
Christoph
Ruditschka - Do 15.05.03 15:01
Danke für die schnelle Antwort. Anstatt den gesamten Code abzutippen habe ich lediglich die Hook-Prozeduren und die Start/StopWatching Prozeduren rüberkopiert.
Wenn ich den Code aus der Website einbaue, erhalte ich noch wesentlich mehr Fehlermeldung von wegen Fehler an dieser und jener Adresse (wer Interesse daran hat, ich kann die ganzen Adressen mal aufschreiben :wink: ).
Durch ein bischen Fehleranalyse mit try...finally weiß ich jetzt immerhin schon, dass bei dem PostMessage-Befehl ein Fehler auftritt.
Aber welcher :?:
Und wie kann ich den beheben :?:
Wie bereits erwähnt, funktioniert der Hook bei einem Klick innerhalb meiner Anwendung einwandfrei.
Gruß
Christoph
Ruditschka - Do 15.05.03 15:04
Titel: Nachtrag
Noch was:
Wenn ich mit F9 die Ausführung starte (also komplett ohne einen einzigen Mausklick), wird der Hook auch im nächsten Moment 16 mal aktiv.
djmasi - Do 15.05.03 15:14
Hast Du eine DLL verwendet oder den Code in Dein Projekt eingebaut? Beschäftige mich erst seit kurzem mit Hooks, aber ich glaube für systemweite Zugriffe macht sich eine DLL am besten.
Ich habe erst das Projekt als ganzes getestet und mir dann die wichtigsten Sachen rausgenommen.
Ruditschka - Do 15.05.03 18:36
Mein Hook sitzt in einer DLL. Aufgrund der Ausgaben, die er testweise macht, weiß ich, dass er systemweit auf jeden Mausklick reagiert. Nur reagiert er meistens 15 mal zu oft und die Nachrichten kommen nicht in meiner Anwendung an.
Gruß
Christoph
Ruditschka - Sa 17.05.03 21:06
Titel: neue Probleme
Ich habe den Hook aus leuter Frust noch einmal von Grund auf neu programmiert. Jetzt läuft er innerhalb meiner Anwendung zu meiner Zufriedenheit. Doch außerhalb meiner Anwendung reagiert er zwar, sendet aber keine Nachrichten an meine Anwendung oder die gesendeten Nachrichten kommen nicht an.
Der Hook sieht in der jetzigen Minimalfunktion so aus:
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:
| const MouseMsg = 'MouseHook-Message';
var HookHandle : Cardinal = 0; ApplicationHandle : Cardinal = 0; WM_MOUSEHOOKMSG : Cardinal = 0;
function MouseHookProc(nCode: Integer; wPara: WPARAM; lPara: LPARAM):LRESULT; stdcall; begin case wPara of WM_RBUTTONDOWN : PostMessage(ApplicationHandle, WM_MOUSEHOOKMSG, 0, 1); WM_LBUTTONDOWN : begin PostMessage(ApplicationHandle, WM_MOUSEHOOKMSG, 0, 2); Beep; end; end; Result := CallNextHookEx(HookHandle, nCode, wPara, lPara); end;
function InstallHook(Handle: HWND): Boolean; stdcall; begin Result := false; If HookHandle = 0 then begin HookHandle := SetWindowsHookEx(WH_MOUSE, @MouseHookProc, hInstance, 0); ApplicationHandle := Handle; ShowMessage(IntToStr(ApplicationHandle)); WM_MOUSEHOOKMSG := RegisterWindowMessage(MouseMsg); Result := true; end; end;
function UninstallHook: Boolean; stdcall; begin Result := UnhookWindowsHookEx(HookHandle); end;
exports InstallHook, UninstallHook; end. |
Hat evtl. noch Jemand eine Idee, warum meine Nachrichten nicht immer ankommen?
Gruß
Christoph
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!