Hallo zusammen,
ich bin seit letzter Woche der Verzweiflung nahe. Ich brauche einen globalen Keyboard-Hook, der Windows-Funktionstasten unterdrückt. Nach ein wenig Suche habe ich unter
www.swissdelphicente...showcode.php?id=1212 ein Beispiel gefunden, welches in dieser Form auch wunderbar funktioniert.
Verwende ich die DLL-Einbindung statisch wie folgt (aus Übersichtsgründen im Beispiel keine Fehlerprüfung, usw.), funktioniert das auch wunderbar:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| interface function SetHook(WinHandle: HWND; MsgToSend: Integer): Boolean; stdcall; external 'GlobalKeyHook.dll'; function FreeHook: Boolean; stdcall; external 'GlobalKeyHook.dll'; (...) implementation procedure Form.StarteHook; begin SetHook(Handle, WM_USER + 300); end; |
Jetzt das Problem: Nachdem ich die Funktionalität nicht immer brauche, würde ich hier gerne dynamisch arbeiten:
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:
| interface type FunctionSetHook = function(WinHandle: HWND; MsgToSend: Integer): Boolean; var funcSetHook: FunctionSetHook; (...) implementation procedure Form.StarteHook; var b: boolean; hKeyboardHook: THandle; begin if FileExists('GlobalKeyHook.dll') then begin hKeyboardHook:= LoadLibrary('GlobalKeyHook.dll'); if hKeyboardHook > 0 then begin @funcSetHook:= GetProcAddress(hKeyboardHook, 'SetHook'); b:= false; if Assigned(funcSetHook) then b:= funcSetHook(Handle, WM_USER + 300); if not b then begin ShowMessage(GetErrorString(GetLastError)); FreeLibrary(hKeyboardHook); hKeyboardHook:= 0; end; end; end; end; |
Nun wird die DLL geladen, SetHook aufgerufen und auch das Ergebnis des Aufrufes ist true. Nach Verlassen der Prozedur steht nun aber nur noch Müll im Speicher und mein Programm geht dann verständlicherweise vor die Hunde.
Hat jemand spontan eine Idee an was das liegen könnte? Ich habe absolut keine Ahnung wo das Problem sein soll...
Vielen Dank für Eure Hilfe
Markus
P.S: Ich habe Delphi 2007 R2 unter WindowsXP im Einsatz...