THook Classe Delphi con codice sorgente

Codice inviato da Jens Borrisholt. Testo di Zarko Gajic.

Di Jens: Ganci, ho visto molte persone che cercavano di creare una soluzione pulita per agganciare i messaggi in un'applicazione. Così ho deciso qualche tempo fa di implementare hook come classe, con eventi e cose interessanti :)

Hook.pas consente di assegnare un puntatore a un puntatore a procedura (con l'aiuto dell'assemblatore).

Ad esempio: se si desidera intercettare TUTTE le sequenze di tasti nell'applicazione, è sufficiente dichiarare un'istanza di TKeyboardHook, assegnare un gestore eventi per OnPreExecute o OnPostExecute o entrambi. Imposta KeyboadHook attivo (KeyboardHook.Active: = True) e sei fuori e in esecuzione ...

Su ganci di Windows

Un hook è un punto nel meccanismo di gestione dei messaggi di sistema in cui un'applicazione può installare una subroutine per monitorare il traffico dei messaggi nel sistema ed elaborare determinati tipi di messaggi prima che raggiungano la procedura della finestra di destinazione.

In breve, un hook è una funzione che puoi creare come parte di una dll o della tua applicazione per monitorare gli "avvenimenti" all'interno del sistema operativo Windows.

L'idea è quella di scrivere una funzione che viene chiamata ogni volta che si verifica un determinato evento in Windows, ad esempio quando un utente preme un tasto sulla tastiera o sposta il mouse.

Per un'introduzione più approfondita agli hook, dai un'occhiata a Cosa sono gli hook di Windows e come usarli all'interno di un'applicazione Delphi.

Il meccanismo di aggancio si basa su messaggi di Windows e funzioni di callback.

Tipi di ganci

Per esempio:
È possibile utilizzare il hook WH_KEYBOARD per monitorare l'input da tastiera inserito in una coda di messaggi;
È possibile utilizzare l'hook WH_MOUSE per monitorare l'input del mouse inserito in una coda di messaggi;
È possibile eseguire una procedura di hook WH_SHELL quando l'applicazione shell sta per essere attivata e quando viene creata o distrutta una finestra di livello superiore.

Hooks.pas

  • TCBTHook: chiamato prima di attivare, creare, distruggere, minimizzare, massimizzare, spostare o ridimensionare una finestra; prima di completare un comando di sistema; prima di rimuovere un evento mouse o tastiera dalla coda dei messaggi di sistema; prima di impostare il focus di input; o prima della sincronizzazione con la coda dei messaggi di sistema.
  • TDebugHook: chiamato prima di chiamare le procedure hook associate a qualsiasi altro hook nel sistema
  • TGetMessageHook: consente a un'applicazione di monitorare i messaggi che stanno per essere restituiti dalla funzione GetMessage o PeekMessage
  • TJournalPlaybackHook: consente a un'applicazione di inserire messaggi nella coda dei messaggi di sistema.
  • TJournalRecordHook: consente di monitorare e registrare eventi di input (per registrare una sequenza di eventi del mouse e della tastiera da riprodurre in seguito utilizzando l'hook WH_JOURNALPLAYBACK).
  • TKeyboardHook: abilita un'applicazione a monitorare il traffico dei messaggi per i messaggi WM_KEYDOWN e WM_KEYUP.
  • TMouseHook: consente di monitorare i messaggi del mouse che stanno per essere restituiti dalla funzione GetMessage o PeekMessage.
  • TLowLevelKeyboardHook: consente di monitorare gli eventi di input da tastiera che stanno per essere pubblicati in una coda di input del thread.
  • TLowLevelMouseHook: consente di monitorare gli eventi di input del mouse che stanno per essere pubblicati in una coda di input del thread.

TKeyboardHook esempio

Scarica hooks.pas + applicazione demo

 usa ganci, ...
var
  KeyboardHook: TKeyboardHook;
...
// Gestore di eventi OnCreate di MainForm TMainForm.FormCreate (Sender: TObject);
inizio
  KeyboardHook: = TKeyboardHook.Create;
  KeyboardHook.OnPreExecute: = KeyboardHookPREExecute;
  KeyboardHook.Active: = True;
fine;
// gestisce OnPREExecuteprocedure di KeyboardHook TMainForm.KeyboardHookPREExecute (Hook: THook; var Hookmsg: THookMsg);
var
  Parola chiave;
inizio
  // Qui puoi scegliere se vuoi restituire // il colpo chiave all'applicazione o meno
  Hookmsg.Result: = IfThen (cbEatKeyStrokes.Checked, 1, 0);
  Chiave: = Hookmsg.WPARAM;
  Didascalia: = Char (chiave);
fine;

Pronto, set, gancio :)