Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Glob. Hook für WM_WINDOWPOSCHANGED bzw WM_WINDOWPOSCHANGING (https://www.delphipraxis.net/151434-glob-hook-fuer-wm_windowposchanged-bzw-wm_windowposchanging.html)

s.h.a.r.k 18. Mai 2010 01:01


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:
// 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;
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.

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:

Luckie 18. Mai 2010 01:12

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: http://assarbad.net/en/stuff/tutorials/hooks/

s.h.a.r.k 18. Mai 2010 11:27

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.

s.h.a.r.k 19. Mai 2010 21:49

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 07:33 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz