c++: Comment intercepter les clics de souris où qu'ils se trouvent
Je suis coincé avec une application que je suis en train d'écrire là où j'ai besoin de surveiller les clics de la souris.
Les clics peuvent se produire n'importe où sur l'écran et pas à l'intérieur de la fenêtre d'application, et pour chaque clic, je dois passer un message (effectuer une action ou quelque chose).
J'ai regardé autour et lire quelques suggestions comme l'utilisation de
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
mais j'ai été infructueuses.
Quelqu'un a une idée sur la manière de mettre en œuvre ce dont j'ai besoin?
Vous pouvez utiliser un crochet: msdn.microsoft.com/en-us/library/windows/desktop/...
Il semble qu'il y a beaucoup de gens qui font mondial du clavier et de la souris crochets récemment, je me demande ce qu'ils veulent tous pour...
Il semble qu'il y a beaucoup de gens qui font mondial du clavier et de la souris crochets récemment, je me demande ce qu'ils veulent tous pour...
OriginalL'auteur GSta | 2012-05-30
Vous devez vous connecter pour publier un commentaire.
Vous devez définir un point de raccordement de souris comme décrit dans MSDN.
Remarque que dans votre cas, le crochet devrait être global. Cela signifie que vous avez besoin pour mettre en œuvre une fonction de gestionnaire dans une DLL, ce qui va être chargé dans tous les processus dans le système qui reçoivent le message de souris. Ces DLL communiquera avec votre application principale à l'aide de certains de communication interprocessus (IPC) comme mécanisme de mémoire partagée ou via des messages Windows posté (pas d'envoi) à partir de la DLL de l'application principale.
Vous pouvez utiliser le code source de cette CodeProject article comme un guide.
Mise à jour: comme par Chris correction, je remarque que ci-dessus s'applique à la "régulière" de la souris crochet qui est synchrone. Hook de bas niveau n'a pas besoin d'être situé dans la DLL, mais il a certaines limites qui sont décrits dans le correspondant de l'article MSDN.
et où ai-je écrire à propos de hook de bas niveau?
Vous n'avez pas. Je suggère à elle en raison de la forte, moins la quantité de travail nécessaire pour le faire fonctionner.
Faible niveau de crochets ont une désagréable inconvénient de limite de temps, qui font qu'il est difficile pour un novice de gérer droit surtout quand fastidieuse opération. Il pourrait être plus facile de traiter avec une DLL. Je suis d'accord avec vous que le Faible niveau de crochet peut être bien pour rapide et sale de tests ou de la simple activité.
d'accord, j'ai vraiment tout en soulignant qu'avec décemment code écrit, la limite de temps pour un LL crochet ne devrait pas être un problème. (Si quelqu'un frappe, ils font des crochets de mal!) De mon point de vue est que la proc pouvez avoir de meilleures perf, mais est plus difficile à écrire en raison de la proc questions; qu'LL a plus de surcharge, mais il est beaucoup plus simple de se lever et courir. Pour un débutant, je vous recommande de commencer avec un LL crochet de jouer avec le crochet dans la première place - sinon, avec une DLL, ils seront passé pas mal de temps à essayer de comprendre la croix-proc choses.
OriginalL'auteur Eugene Mayevski 'Allied Bits
eh bien, je ne sais pas vraiment si vous avez résolu votre problème. Je l'espère.
Mais j'étais dans le même problème aujourd'hui et de recherche, j'ai trouvé une façon vraiment facile à faire.
Donc vous êtes ici:
la clé de cette solution est la fonction GetAsyncKeyState(clé), clé où quiconque des codes qui apparaît ici https://msdn.microsoft.com/en-us/library/dd375731(SV.85).aspx
OriginalL'auteur Enrique Wood
Vous pouvez utiliser
SetWindowsHookEx
Voici un petit échantillon:
Faire
GetCursorPos
à l'intérieur de la souris, le crochet est inutiles. LelParam
est une adresse à unMSLLHOOKSTRUCT
qui contient un champpt
qui a le point info.E0167 argument de type "LRESULT (__stdcall OpenCVApp::*)(int nCode, WPARAM wParam, LPARAM lParam)" est incompatible avec le paramètre de type "HOOKPROC"
OriginalL'auteur Aurus
LRESULT CALLBACK WndProc(...)
, comme son nom l'indique est un (spécifique) de la fenêtre (message) processeur qui vous permet d'analyser et de répondre aux messages sur la file d'attente qui ont été reportés par le système personnalisé de votre définition de la fonction de rappel pour la suite du traitement.Puisque vous voulez détecter et agir sur les clics de la souris n'importe où sur l'écran, comme chris l'a suggéré dans les commentaires, une solution est de brancher vous-même dans le système en appelant SetWindowsHookEx() ce qui est assez prolixe dans sa définition même - il vous permet de suivre les trucs qui se passe sur le système et le relais de cette information à votre demande.
C'est la syntaxe qui vous devez employer pour obtenir vous-même
Il faut dans un hook, qui sont fondamentalement peu #définit le dire à la fonction de ce type de messages que vous souhaitez recevoir de tout le système, vous faire passer un rappel tout comme le WndProc, mais cette fois il est destiné à traiter les messages entrants concernant l'ensemble du système. hMod se réfère simplement à la poignée de l'application ou la DLL dans laquelle les cités proc fonction de rappel est situé dans. Le dernier en date concerne les threads en cours d'exécution sur le système, le réglage à 0 ou NULL extrait des messages pour tous les threads existants.
Important:
Ne remarque que Aurus' exemple appel à la SetWindowsHookEx est spécifique à un processus qui un mot de fantaisie relatives à une demande réelle, au lieu d'une DLL qui peuvent être ajoutés à des processus multiples, l'ensemble du système ( global ) et de retour d'information à votre demande. Il serait prudent de prendre le temps et d'efforts pour enquêter sur Eugene la méthode recommandée par la place de cette approche puissante et utile seulement pour les expériences. C'est un peu plus "dures", mais la récompense en vaut la peine.
Moins de travail n'est pas toujours le meilleur ou préférable.
OriginalL'auteur