Accrochez la souris pour capturer des événements en dehors d'une application

Apprenez à suivre l'activité de la souris même lorsque votre application Delphi n'est pas active, se trouve dans le bac ou n'a aucune interface utilisateur..

En installant un crochet de souris à l'échelle du système (ou global), vous pouvez surveiller ce que l'utilisateur fait avec la souris et agir en conséquence.

Qu'est-ce qu'un crochet et comment ça marche?

En bref, un hook est une fonction (rappel) que vous pouvez créer dans le cadre d'une DLL (bibliothèque de liens dynamiques) ou de votre application pour surveiller les `` événements '' à l'intérieur du système d'exploitation Windows.
Il existe 2 types de crochets - global et local. Un hook local surveille les événements qui ne se produisent que pour un programme (ou thread) spécifique. Un hook global surveille l'ensemble du système (tous les threads).

Pour créer un hook global, vous avez besoin de 2 projets, 1 pour créer le fichier exécutable et 1 pour créer une DLL contenant la procédure de hook.

Notre article sur l'utilisation des crochets de clavier de Delphi explique comment intercepter l'entrée du clavier pour les contrôles qui ne peuvent pas recevoir le focus d'entrée (comme TImage).

Accrocher la souris

De par sa conception, le mouvement de la souris est limité par la taille de l'écran de votre bureau (y compris la barre des tâches Windows). Lorsque vous déplacez la souris vers le bord gauche / droit / haut / bas, la souris "s'arrête" - comme prévu (si vous n'avez pas plus d'un moniteur).

Voici une idée pour le crochet de souris à l'échelle du système: si, par exemple, vous souhaitez déplacer la souris vers la droite de l'écran lorsqu'elle se déplace vers le bord gauche (et la "touche"), vous pouvez écrire un crochet de souris global repositionner le pointeur de la souris.

Vous commencez par créer un projet de bibliothèque de liens dynamiques. La DLL doit exporter deux méthodes: "HookMouse" et "UnHookMouse".

La procédure HookMouse appelle la SetWindowsHookEx API passant le "WH_MOUSE" pour le premier paramètre - installant ainsi une procédure de hook qui surveille les messages de la souris. L'un des paramètres de SetWindowsHookEx est votre fonction de rappel que Windows appellera quand il y a un message de souris à traiter:

SetWindowsHookEx (WH_MOUSE, @HookProc, HInstance, 0);

Le dernier paramètre (valeur = 0) dans SetWindowsHookEx définit que nous enregistrons un hook global.

Le HookProc analyse les messages liés à la souris et envoie un message personnalisé ("MouseHookMessage") à notre projet de test:

 une fonction HookProc (nCode: Integer; MsgID: WParam; Data: LParam): LResult; stdcall;

var

    mousePoint: TPoint;

    notifyTestForm: booléen;

    MouseDirection: TMouseDirection;

 commencer

    mousePoint: = PMouseHookStruct (Data) ^. pt;

 

    notifyTestForm: = false;

 

    si (mousePoint.X = 0) ensuite

    commencer

      Windows.SetCursorPos (-2 + Screen.Width, mousePoint.y);

      notifyTestForm: = true;

      MouseDirection: = mdRight;

    fin;


  
si notifyTestForm ensuite

    commencer

      PostMessage (FindWindow ('TMainHookTestForm', nil), MouseHookMessage, MsgID, Integer (MouseDirection));

    fin;

   Résultat: = CallNextHookEx (Hook, nCode, MsgID, Data);
fin;

Pointe: Lisez les fichiers d'aide du SDK Win32 pour en savoir plus sur l'enregistrement PMouseHookStruct et la signature de la fonction HookProc.

Remarque: Une fonction de raccordement n'a pas besoin d'envoyer quoi que ce soit - l'appel PostMessage est utilisé uniquement pour indiquer que la DLL peut communiquer avec le monde "extérieur".

Crochet de souris "Listener"

Le message "MouseHookMessage" est publié dans votre projet de test - un formulaire nommé "TMainHookTestForm". Vous allez remplacer la méthode WndProc pour obtenir le message et agir selon les besoins:

 procédure TMainHookTestForm.WndProc (var Message: TMessage);

commencer

    hérité WndProc (Message);

  
si Message.Msg = HookCommon.MouseHookMessage ensuite

    commencer

      // implémentation trouvée dans le code d'accompagnement

      Signal (TMouseDirection (Message.LParam));

    fin;

fin;

Bien sûr, lorsque le formulaire est créé (OnCreate), vous appelez la procédure HookMouse à partir de la DLL, lorsqu'il se ferme (OnDestroy), vous appelez la procédure UnHookMouse.

Remarque: Les hooks ont tendance à ralentir le système car ils augmentent la quantité de traitement que le système doit effectuer pour chaque message. Vous devez installer un crochet uniquement lorsque cela est nécessaire et le retirer dès que possible.