THook Delphi-Klasse mit Quellcode

Code eingereicht von Jens Borrisholt. Text von Zarko Gajic.

Von Jens: Ich habe viele Leute gesehen, die versucht haben, eine saubere Lösung für das Einbinden von Nachrichten in eine Anwendung zu finden. Also habe ich mich vor einiger Zeit entschlossen, Hooks als Klasse zu implementieren, mit schönen Events und so :)

Hook.pas ermöglicht es, einem Prozedurzeiger einen Methodenzeiger zuzuweisen (mit etwas Hilfe von Assembler).

Beispiel: Wenn Sie ALLE Tastenanschläge in Ihrer Anwendung abfangen möchten, deklarieren Sie einfach eine Instanz von TKeyboardHook, weisen Sie einen Ereignishandler für OnPreExecute oder OnPostExecute oder beides zu. Aktivieren Sie KeyboadHook (KeyboardHook.Active: = True) und Sie sind unterwegs…

Auf Windows-Hooks

Ein Hook ist ein Punkt im Mechanismus zur Verarbeitung von Systemnachrichten, an dem eine Anwendung eine Unterroutine installieren kann, um den Nachrichtenverkehr im System zu überwachen und bestimmte Nachrichtentypen zu verarbeiten, bevor sie die Zielfensterprozedur erreichen.

Kurz gesagt, ein Hook ist eine Funktion, die Sie als Teil einer DLL oder Ihrer Anwendung erstellen können, um die Vorgänge im Windows-Betriebssystem zu überwachen.

Die Idee ist, eine Funktion zu schreiben, die jedes Mal aufgerufen wird, wenn ein bestimmtes Ereignis in Windows auftritt - zum Beispiel, wenn ein Benutzer eine Taste auf der Tastatur drückt oder die Maus bewegt.

Eine ausführlichere Einführung in Hooks finden Sie unter Was sind Windows-Hooks und wie werden sie in einer Delphi-Anwendung verwendet ?..

Der Hooking-Mechanismus basiert auf Windows-Nachrichten und Rückruffunktionen.

Arten von Haken

Beispielsweise:
Mit dem WH_KEYBOARD-Hook können Sie Tastatureingaben überwachen, die in eine Nachrichtenwarteschlange gestellt wurden.
Sie können den WH_MOUSE-Hook verwenden, um Mauseingaben zu überwachen, die in eine Nachrichtenwarteschlange gestellt wurden.
Sie können eine WH_SHELL-Hook-Prozedur ausführen, wenn die Shell-Anwendung aktiviert werden soll und wenn ein Fenster der obersten Ebene erstellt oder zerstört wird.

Hooks.pas

  • TCBTHook - wird aufgerufen, bevor ein Fenster aktiviert, erstellt, zerstört, minimiert, maximiert, verschoben oder in der Größe geändert wird. bevor Sie einen Systembefehl ausführen; vor dem Entfernen eines Maus- oder Tastaturereignisses aus der Systemmeldungswarteschlange; vor dem Einstellen des Eingabefokus; oder vor dem Synchronisieren mit der Systemmeldungswarteschlange.
  • TDebugHook - wird aufgerufen, bevor Hook-Prozeduren aufgerufen werden, die mit einem anderen Hook im System verknüpft sind
  • TGetMessageHook - Ermöglicht einer Anwendung die Überwachung von Nachrichten, die von den Funktionen GetMessage oder PeekMessage zurückgegeben werden sollen
  • TJournalPlaybackHook - Ermöglicht einer Anwendung, Nachrichten in die Systemnachrichtenwarteschlange einzufügen.
  • TJournalRecordHook - Ermöglicht das Überwachen und Aufzeichnen von Eingabeereignissen (zum Aufzeichnen einer Sequenz von Maus- und Tastaturereignissen für die spätere Wiedergabe mithilfe des WH_JOURNALPLAYBACK-Hooks)..
  • TKeyboardHook - Ermöglicht einer Anwendung, den Nachrichtenverkehr für WM_KEYDOWN- und WM_KEYUP-Nachrichten zu überwachen.
  • TMouseHook - Ermöglicht die Überwachung von Mausnachrichten, die von der GetMessage- oder PeekMessage-Funktion zurückgegeben werden sollen.
  • TLowLevelKeyboardHook - Ermöglicht die Überwachung von Tastatureingabeereignissen, die in eine Thread-Eingabewarteschlange gestellt werden sollen.
  • TLowLevelMouseHook - Ermöglicht die Überwachung von Mauseingabeereignissen, die in eine Thread-Eingabewarteschlange gestellt werden sollen.

TKeyboardHook-Beispiel

Laden Sie die Anwendung hooks.pas + demo herunter

 benutzt Haken,…
var
  KeyboardHook: TKeyboardHook;

// MainForms OnCreate-Ereignisbehandlungsprozedur TMainForm.FormCreate (Sender: TObject);
Start
  KeyboardHook: = TKeyboardHook.Create;
  KeyboardHook.OnPreExecute: = KeyboardHookPREExecute;
  KeyboardHook.Active: = True;
Ende;
// behandelt die OnPREExecute-Prozedur von KeyboardHook TMainForm.KeyboardHookPREExecute (Hook: THook; var Hookmsg: THookMsg);
var
  Stichwort;
Start
  // Hier können Sie wählen, ob Sie den // Tastendruck an die Anwendung zurückgeben möchten oder nicht
  Hookmsg.Result: = IfThen (cbEatKeyStrokes.Checked, 1, 0);
  Key: = Hookmsg.WPARAM;
  Beschriftung: = Char (Schlüssel);
Ende;

Fertig, fertig, Haken :)