AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Glob. Hook für WM_WINDOWPOSCHANGED bzw WM_WINDOWPOSCHANGING
Thema durchsuchen
Ansicht
Themen-Optionen

Glob. Hook für WM_WINDOWPOSCHANGED bzw WM_WINDOWPOSCHANGING

Ein Thema von s.h.a.r.k · begonnen am 18. Mai 2010 · letzter Beitrag vom 19. Mai 2010
Antwort Antwort
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#1

Glob. Hook für WM_WINDOWPOSCHANGED bzw WM_WINDOWPOSCHANGING

  Alt 18. Mai 2010, 02:01
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 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!
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Glob. Hook für WM_WINDOWPOSCHANGED bzw WM_WINDOWPOSCHANG

  Alt 18. Mai 2010, 02:12
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/
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#3

Re: Glob. Hook für WM_WINDOWPOSCHANGED bzw WM_WINDOWPOSCHANG

  Alt 18. Mai 2010, 12:27
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.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#4

Re: Glob. Hook für WM_WINDOWPOSCHANGED bzw WM_WINDOWPOSCHANG

  Alt 19. Mai 2010, 22:49
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;
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:21 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