Hallo !!
Ich habe mich heute mit Hooks beschäftigt und bin auf dieses
Hook Tutorial gestoßen. Und das ganze funktioniert schon ganz gut. Bei globalen Hooks empfiehlt der Autor, per MMF Daten an die eigene Anwendung zu schicken. Mir war das zu kompliziert, deshalb habe ich überlegt, ich schicke meinem Fenster einfach eine Message (WM_USER + x) und passe den wParam und lParam nach meinen Wünschen an. Das funktioniert auch, aber nur so lange meine eigene Form im Vordergrund ist.
Das ist natürlich sehr seltsam. Zum schicken der Nachricht verwende ich SendMessage. Der Fehler liegt auch bei dieser Funktion, denn die Hook-Prozedur wird auch ausgeführt, wenn mein Fenster im Hintergrund ist.
Hier mal ein bisschen Code, vielleicht hilft er euch ja weiter.
Delphi-Quellcode:
// aus der DLL
const
WM_MOUSEHOOKMSG = WM_USER + 1;
var
GlobalHooksFormHandle: HWND = 0;
MouseHookHandle: HHOOK = 0;
function MouseHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT;
stdcall;
var
LMouseHookStruct: TMouseHookStruct;
LMousePositionX: Integer;
LMousePositionY: Integer;
begin
if nCode = HC_ACTION
then
begin
LMouseHookStruct := PMouseHookStruct(lParam)^;
LMousePositionX := LMouseHookStruct.pt.X;
LMousePositionY := LMouseHookStruct.pt.Y;
if GlobalHooksFormHandle <> 0
then
SendMessage(GlobalHooksFormHandle, WM_MOUSEHOOKMSG, LMousePositionX, LMousePositionY);
end;
Result := CallNextHookEx(MouseHookHandle, nCode, wParam, lParam);
end;
function InstallHooks(AGlobalHooksFormHandle: HWND): Boolean;
stdcall;
var
LMouseHookProc: TFNHookProc;
begin
GlobalHooksFormHandle := AGlobalHooksFormHandle;
LMouseHookProc := MouseHookProc;
MouseHookHandle := SetWindowsHookEx(WH_MOUSE, LMouseHookProc, HInstance, 0);
Result := MouseHookHandle <> 0;
end;
Habt ihr Ideen, wieso er die Message nicht mehr schickt ??
Falls euch der Code nicht reicht, ich hab mal die ganze Projektgruppe angehängt.
Vielen Dank schon mal im Voraus,
Oliver