![]() |
Hook funktioniert nicht systemweit
Hallo.
Folgendes: Ich habe mir mal das Hook Tutorial von Luckie (kein Tutorial, Quelltext) und von Assarbad angeschaut. Habe mir daraus was zusammen geklebt... Bin auch fast zufrieden, bis auf das der Hook nur dann aktiv ist, wenn mein Programm den Fokus hat. Wie kann ich den Hook Systemweit aktivieren? Hab echt keine Ahnung wie das geht... :wiejetzt: :gruebel: Hier Dll Code:
Delphi-Quellcode:
MfG
library TastaturHook;
uses Windows, Messages; const WM_KEYBOARD_HOOK = WM_USER + 52012; var HookHandle: Cardinal = 0; WindowHandle: Cardinal = 0; function KeyboardHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; begin Result := CallNextHookEx(HookHandle, nCode, wParam, lParam); case nCode < 0 of TRUE:exit; FALSE: begin PostMessage(WindowHandle,WM_KEYBOARD_HOOK,WParam,LParam); end; end; end; function InstallHook(Hwnd: Cardinal): Boolean; stdcall; var keyhooked: boolean; begin keyhooked := false; if HookHandle = 0 then begin HookHandle := SetWindowsHookEx(WH_KEYBOARD, @KeyboardHookProc, HInstance, 0);; HookHandle:=1; end; WindowHandle := Hwnd; Result := keyhooked; end; function UninstallHook: Boolean; stdcall; var keybh: boolean; begin keybh := UnhookWindowsHookEx(HookHandle); HookHandle := 0; Result := keybh; if Result then WindowHandle := 0; end; exports InstallHook, UninstallHook; begin end. Flips |
Re: Hook funktioniert nicht systemweit
Hi,
daran wirds nicht wirklich liegen aber: Zitat:
du setzt dein HookHandle auf 1 statt den Rückgabewert der SetWindowsHookEx zu verwenden! Machs doch lieber so:
Delphi-Quellcode:
function InstallHook(Hwnd: Cardinal): Boolean; stdcall;
var UnInst:boolean; begin if HookHandle <> 0 then UnInst := UninstallHook; else UnInst := True; HookHandle := SetWindowsHookEx(WH_KEYBOARD, @KeyboardHookProc, HInstance, 0); WindowHandle := Hwnd; Result := (HookHandle <> 0) and UnInst; end; |
Re: Hook funktioniert nicht systemweit
Damit sollte es immer noch nicht funktionieren.
Bei globalen Hooks muss man den Hook-Handle in einer Weise aufheben das alle Hook-DLLs ihn benutzen koennen. Die Hook-DLL wird naemlich allen laufenden Prozessen zugeschlagen und es ist eine Kopie der DLL. Das Datensegment mit den globalen Variablen ist fuer jede Kopie der DLL separat. Daraus folgt das nur genau eine Kopie den Hook-Handle hat. Entsprechend funktioniert meistens CallNextHookEx nicht. Es gibt mehrere Methoden den Hook-Handle geeignet aufzuheben. Ein Shared Segment ist nur mit MS VC++ leicht moeglich. Peter Vones hat aber ein Tool geschrieben, das es auch fuer Delphi moeglich macht. Siehe Borland Code Central. Man kann den Hook-Handle aber auch in ein Memory Mapped File stecken. |
Re: Hook funktioniert nicht systemweit
Nach langen überlegen is mit das auch eingefallen. Schon praktisch die MMF´s. Müsste man mal bekannter machen...
Thx @ all. ps: Programm ist jetzt fertig |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz