Haken 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 Tablett oder tut habe keine Benutzeroberfläche überhaupt.

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

Was ist ein Haken und wie funktioniert er?

Kurz gesagt, ein Haken ist ein (Ruf zurück) Funktion, die Sie als Teil einer DLL erstellen können (Dynamische Link Bibliothek) oder Ihre Anwendung, um das Geschehen im Windows-Betriebssystem zu überwachen.
Es gibt zwei Arten von Hooks - globale und lokale. 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 mit der Hook-Prozedur.

Unser Artikel über Arbeiten mit Tastaturhaken von Delphi erklärt, wie die Tastatureingabe für Steuerelemente abgefangen wird, die den Eingabefokus nicht empfangen können (wie TImage).

instagram viewer

Die Maus einhaken

Die Bewegung der Maus wird standardmäßig durch die Größe Ihres Desktop-Bildschirms (einschließlich der Windows-Taskleiste) eingeschränkt. Wenn Sie die Maus zum linken / rechten / oberen / unteren Rand 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 auf die rechte Seite des Bildschirms bewegen möchten Wenn es sich zum linken Rand bewegt (und es "berührt"), können Sie einen globalen Maushaken schreiben, um die Maus neu zu positionieren Zeiger.

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 und somit eine Hook-Prozedur installiert, die Mausnachrichten überwacht. Einer der Parameter für SetWindowsHookEx ist Ihre Rückruffunktion, die Windows aufruft, wenn eine Mausnachricht verarbeitet werden soll:

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 (Daten) ^. pt;


 notifyTestForm: = false;


wenn (mousePoint. X = 0) dann

Start

 Windows. SetCursorPos (-2 + Bildschirm. Breite, 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, Daten);
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 nirgendwo etwas 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 Botschaft. Msg = HookCommon. MouseHookMessage dann

Start

// Implementierung im zugehörigen Code

 Signal (TMouseDirection (Nachricht). LParam));

Ende;

Ende;

Wenn Sie das Formular erstellen (OnCreate), rufen Sie natürlich die HookMouse-Prozedur aus der DLL auf, und wenn es geschlossen wird (OnDestroy), rufen Sie die UnHookMouse-Prozedur auf.

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