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 ...
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.
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.
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 :)