Hängen Sie die Maus ein, um Ereignisse außerhalb einer Anwendung abzufangen

Erfahren Sie, wie Sie die Mausaktivität verfolgen können, auch wenn Ihre Delphi-Anwendung nicht aktiv ist, sich in der Taskleiste befindet oder überhaupt keine Benutzeroberfläche hat.

Durch die Installation eines systemweiten (oder globalen) Maus-Hooks können Sie überwachen, was der Benutzer mit der Maus tut, und entsprechend handeln.

Was ist ein Haken und wie funktioniert es??

Kurz gesagt, ein Hook ist eine (Rückruf-) Funktion, die Sie als Teil einer DLL (Dynamic Link Library) oder Ihrer Anwendung erstellen können, um die Vorgänge im Windows-Betriebssystem zu überwachen.
Es gibt zwei Arten von Hooks - global und lokal. Ein lokaler Hook überwacht Dinge, die nur für ein bestimmtes Programm (oder einen bestimmten Thread) geschehen. Ein globaler Hook überwacht das gesamte System (alle Threads).

Um einen globalen Hook zu erstellen, benötigen Sie 2 Projekte, 1 zum Erstellen der ausführbaren Datei und 1 zum Erstellen einer DLL, die die Hook-Prozedur enthält.

In unserem Artikel zum Arbeiten mit Tastatur-Hooks von Delphi wird erläutert, wie Sie die Tastatureingabe für Steuerelemente abfangen, die den Eingabefokus nicht erhalten können (wie TImage)..

Maus einhängen

Die Bewegung der Maus wird von Entwurf durch die Größe Ihres Desktop-Bildschirms (einschließlich der Windows-Taskleiste) eingeschränkt. Wenn Sie die Maus nach links / rechts / oben / unten bewegen, stoppt die Maus - wie erwartet (wenn Sie nicht mehr als einen Monitor haben).

Hier ist eine Idee für den systemweiten Maushaken: Wenn Sie beispielsweise die Maus zur rechten Seite des Bildschirms bewegen möchten, wenn sie sich zum linken Rand bewegt (und ihn "berührt"), können Sie einen globalen Maushaken schreiben um den Mauszeiger neu zu positionieren.

Sie erstellen zunächst ein dynamisches Linkbibliotheksprojekt. Die DLL sollte zwei Methoden exportieren: "HookMouse" und "UnHookMouse".

Die HookMouse-Prozedur ruft die auf SetWindowsHookEx API, die "WH_MOUSE" für den ersten Parameter übergibt, wodurch eine Hook-Prozedur installiert wird, die Mausnachrichten überwacht. Einer der Parameter für SetWindowsHookEx ist Ihre Rückruffunktion, die Windows aufruft, wenn eine Mausnachricht verarbeitet werden muss:

SetWindowsHookEx (WH_MOUSE, @HookProc, HInstance, 0);

Der letzte Parameter (Wert = 0) in SetWindowsHookEx definiert, dass ein globaler Hook registriert wird.

Der HookProc analysiert die mausbezogenen Nachrichten und sendet eine benutzerdefinierte Nachricht ("MouseHookMessage") an unser Testprojekt:

 Funktion HookProc (nCode: Integer; MsgID: WParam; Daten: LParam): LResult; stdcall;

var

    mousePoint: TPoint;

    notifyTestForm: boolean;

    MouseDirection: TMouseDirection;

 Start

    mousePoint: = PMouseHookStruct (Data) ^. pt;

 

    notifyTestForm: = false;

 

    wenn (mousePoint.X = 0) dann

    Start

      Windows.SetCursorPos (-2 + Screen.Width, mousePoint.y);

      notifyTestForm: = true;

      MouseDirection: = mdRight;

    Ende;


  
wenn notifyTestForm dann

    Start

      PostMessage (FindWindow ('TMainHookTestForm', nil), MouseHookMessage, MsgID, Integer (MouseDirection));

    Ende;

   Ergebnis: = CallNextHookEx (Hook, nCode, MsgID, Data);
Ende;

Trinkgeld: Lesen Sie die Win32 SDK-Hilfedateien, um Informationen zum PMouseHookStruct-Datensatz und zur Signatur der HookProc-Funktion zu erhalten.

Hinweis: Eine Hook-Funktion muss nichts irgendwohin senden - der PostMessage-Aufruf wird nur verwendet, um anzuzeigen, dass die DLL mit der "äußeren" Welt kommunizieren kann.

Maushaken "Listener"

Die Nachricht "MouseHookMessage" wird an Ihr Testprojekt gesendet - ein Formular mit dem Namen "TMainHookTestForm". Sie überschreiben die WndProc-Methode, um die Nachricht abzurufen und nach Bedarf zu handeln:

 Verfahren TMainHookTestForm.WndProc (var Nachricht: TMessage);

Start

    vererbt WndProc (Nachricht);

  
wenn Message.Msg = HookCommon.MouseHookMessage dann

    Start

      // Implementierung im zugehörigen Code gefunden

      Signal (TMouseDirection (Message.LParam));

    Ende;

Ende;

Wenn das Formular erstellt wird (OnCreate), rufen Sie die HookMouse-Prozedur aus der DLL auf, und wenn sie geschlossen wird (OnDestroy), rufen Sie die UnHookMouse-Prozedur auf.

Anmerkung: Hooks verlangsamen in der Regel das System, da sie den Verarbeitungsaufwand des Systems für jede Nachricht erhöhen. Sie sollten einen Haken nur bei Bedarf installieren und ihn so schnell wie möglich entfernen.