![]() |
Glob. Hook für WM_WINDOWPOSCHANGED bzw WM_WINDOWPOSCHANGING
Hallo zusammen,
und zwar versuche ich schon seit geraumer Zeit einen Anwendungs-globalen Hook für die Windows-Botschaften WM_WINDOWPOSCHANGING oder WM_WINDOWPOSCHANGED zu implementieren. Ziel ist es, die Bewegung eines beliebigen anderen Fenster festzustellen und darauf zu reagieren. Ich habe mich ein wenig eingelesen, da ich nicht all zu viel Ahnung von Hooks hatte, bis ich nun alles zum Laufen gebracht habe :zwinker: Folgenden Code habe ich im Moment:
Delphi-Quellcode:
Ich habe die interessanten Stellen im Code markiert. Zum einen handelt es sich um den Aufruf von SetWindowsHookEx, bei dem ich nicht genau weiß, mit welchem ersten Parameter ich diesen nutzen soll. Ich will eben nur die oben genannten Messages abfangen.
// Hook registrieren, aber welche WH_xxx soll ich nehmen?
FHookHandle := SetWindowsHookEx(WH_MAX, FHookMethodPointer, 0, GetCurrentThreadId()); { ... } function TMyClass.HookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LResult; stdcall; var P: PEventMsg; begin case nCode < HC_ACTION of True: Result := CallNextHookEx(FHookHandle, nCode, wParam, lParam); else if (lParam <> 0) then begin // // Diesen Code habe ich wo gefunden, er funktioniert aber nicht wirklich, // da nie was ins Memo geschrieben wird. :-/ // P := PEventMsg(lParam); if (P.message = WM_WINDOWPOSCHANGED) or (P.message = WM_WINDOWPOSCHANGING) then Memo1.Lines.Add('blub'); end; Result := CallNextHookEx(FHookHandle, nCode, wParam, lParam); end; end; Des weiteren will ich in der Hook-Nachrichtenschleife genau diese Messages abfangen und komme aber nicht wirklich zum Ziel. Ich hoffe, ihr könnt mir hier weiterhelfen! :wink: |
Re: Glob. Hook für WM_WINDOWPOSCHANGED bzw WM_WINDOWPOSCHANG
Punkt eins: Soll der Hook global sein, so muss der Code in einer DLL implementiert werden, damit er in fremde Prozesse injeziert werden kann. Daraus folgt Punkt zwei: In einer DLL können keine Klassen verwendet werden.
Ein gutes Hook Tutorial ist immer noch das von Oliver: ![]() |
Re: Glob. Hook für WM_WINDOWPOSCHANGED bzw WM_WINDOWPOSCHANG
Ich will mich nicht in eine fremde Anwendung einhooken, sondern nur in eine projektinterne Form. Vielleicht wurde das mit meinem ersten Post nicht ganz klar.
|
Re: Glob. Hook für WM_WINDOWPOSCHANGED bzw WM_WINDOWPOSCHANG
Problem wurde gelöst! Ich habe mir einfach Windows.pas umgeschaut und siehe da, es gibt einen Zeiger auf ein Struct PCWPStruct mit den ich mein Problem lösen konnte. Hier die Hook-Procedure:
Delphi-Quellcode:
function TfrmDarkOverlay.HookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LResult; stdcall;
var P: PCWPStruct; begin case nCode < HC_ACTION of True: Result := CallNextHookEx(FHookHandle, nCode, wParam, lParam); else if (lParam <> 0) then begin P := PCWPStruct(lParam); if (P.message = WM_WINDOWPOSCHANGING) then Memo1.Lines.Add('P.message = WM_WINDOWPOSCHANGING'); end; Result := CallNextHookEx(FHookHandle, nCode, wParam, lParam); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:47 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