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

click fraud protection

Apprenez à suivre l'activité de la souris même lorsque votre application Delphi n'est pas active, se trouve dans le plateau ou fait pas d'interface utilisateur du tout.

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

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

En bref, un crochet est un (rappeler), fonction que vous pouvez créer dans le cadre d'une DLL (bibliothèque de liens dynamiques) ou votre application pour surveiller les «événements» dans le 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 travailler avec des crochets de clavier de Delphi

instagram viewer
explique comment intercepter l'entrée du clavier pour les commandes 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 la souris à l'échelle du système: si, par exemple, vous souhaitez déplacer la souris sur le côté droit de l'écran quand il se déplace vers le bord gauche (et le "touche"), vous pouvez écrire un crochet global de souris pour repositionner la souris aiguille.

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; Données: LParam): LResult; stdcall;

var

 mousePoint: TPoint;

 notifyTestForm: booléen;

 MouseDirection: TMouseDirection;

commencer

 mousePoint: = PMouseHookStruct (Data) ^. pt;


 notifyTestForm: = false;


si (mousePoint. X = 0) ensuite

commencer

 Les fenêtres. SetCursorPos (-2 + écran. Largeur, 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 est fermé (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.

instagram story viewer