THook Delphi Class avec le code source

Code soumis par Jens Borrisholt. Texte de Zarko Gajic.

Par Jens: Hooks, j'ai vu beaucoup de gens essayer de faire une solution propre pour accrocher des messages dans une application. J'ai donc décidé il y a quelque temps d'implémenter des hooks en tant que classe, avec de beaux événements et d'autres choses :)

Hook.pas permet d'affecter un pointeur de méthode à un pointeur de procédure (avec l'aide de l'assembleur).

Par exemple: si vous souhaitez intercepter TOUTES les frappes dans votre application - déclarez simplement une instance de TKeyboardHook, affectez un gestionnaire d'événements pour OnPreExecute ou OnPostExecute, ou les deux. Définissez-vous KeyboadHook actif (KeyboardHook.Active: = True) et vous êtes en cours d'exécution…

Sur les crochets Windows

Un hook est un point du mécanisme de gestion des messages du système où une application peut installer un sous-programme pour surveiller le trafic des messages dans le système et traiter certains types de messages avant qu'ils n'atteignent la procédure de la fenêtre cible.

En bref, un hook est une fonction que vous pouvez créer dans le cadre d'une DLL ou de votre application pour surveiller les `` événements '' dans le système d'exploitation Windows.

L'idée est d'écrire une fonction qui est appelée à chaque fois qu'un certain événement dans Windows se produit - par exemple lorsqu'un utilisateur appuie sur une touche du clavier ou déplace la souris.

Pour une introduction plus approfondie aux hooks, regardez ce que sont les hooks Windows et comment les utiliser dans une application Delphi.

Le mécanisme de raccordement repose sur les messages Windows et les fonctions de rappel.

Types de crochets

Par exemple:
Vous pouvez utiliser le crochet WH_KEYBOARD pour surveiller l'entrée du clavier publiée dans une file d'attente de messages;
Vous pouvez utiliser le hook WH_MOUSE pour surveiller l'entrée de la souris publiée dans une file d'attente de messages;
Vous pouvez une procédure de hook WH_SHELL lorsque l'application shell est sur le point d'être activée et lorsqu'une fenêtre de niveau supérieur est créée ou détruite.

Hooks.pas

  • TCBTHook - appelé avant d'activer, de créer, de détruire, de minimiser, de maximiser, de déplacer ou de dimensionner une fenêtre; avant d'exécuter une commande système; avant de supprimer un événement de souris ou de clavier de la file d'attente de messages système; avant de régler la mise au point d'entrée; ou avant la synchronisation avec la file d'attente de messages système.
  • TDebugHook - appelé avant d'appeler des procédures de hook associées à tout autre hook du système
  • TGetMessageHook - permet à une application de surveiller les messages sur le point d'être renvoyés par la fonction GetMessage ou PeekMessage
  • TJournalPlaybackHook - permet à une application d'insérer des messages dans la file d'attente de messages système.
  • TJournalRecordHook - vous permet de surveiller et d'enregistrer des événements d'entrée (pour enregistrer une séquence d'événements de souris et de clavier à lire ultérieurement en utilisant le crochet WH_JOURNALPLAYBACK).
  • TKeyboardHook - permet à une application de surveiller le trafic des messages pour les messages WM_KEYDOWN et WM_KEYUP.
  • TMouseHook - vous permet de surveiller les messages de la souris sur le point d'être renvoyés par la fonction GetMessage ou PeekMessage.
  • TLowLevelKeyboardHook - vous permet de surveiller les événements d'entrée au clavier sur le point d'être publiés dans une file d'attente d'entrée de thread.
  • TLowLevelMouseHook - vous permet de surveiller les événements d'entrée de souris sur le point d'être publiés dans une file d'attente d'entrée de thread.

Exemple TKeyboardHook

Télécharger l'application hooks.pas + démo

 utilise des crochets,…
var
  KeyboardHook: TKeyboardHook;

// Gestionnaire d'événement OnCreate de MainForm TMainForm.FormCreate (Sender: TObject);
commencer
  KeyboardHook: = TKeyboardHook.Create;
  KeyboardHook.OnPreExecute: = KeyboardHookPREExecute;
  KeyboardHook.Active: = True;
fin;
// gère OnPREExecuteprocedure TMainForm.KeyboardHookPREExecute de KeyboardHook (Hook: THook; var Hookmsg: THookMsg);
var
  Mot-clé;
commencer
  // Ici, vous pouvez choisir si vous souhaitez retourner // le coup de clé à l'application ou non
  Hookmsg.Result: = IfThen (cbEatKeyStrokes.Checked, 1, 0);
  Clé: = Hookmsg.WPARAM;
  Légende: = Char (clé);
fin;

Prêt, prêt, accroché :)