Comment faire un hook clavier mondiale à travers des processus
Je suis en train de créer un utilitaire de frappe application pour que je puisse faire des choses comme tuer une sélection de processus ou de lancer quelque chose. Je suis penser que je devrais tenir cmd dans n'importe quelle application, puis tapez un numéro à 4 chiffres sur la touche de commande afin que je puisse lancer ou de tuer quoi que ce soit rapidement pendant la programmation, le débogage de regarder une vidéo, etc.
J'ai compris comment obtenir le clavier de rappel, mais pour quelque raison que ce soit, une fois que je clique sur une autre application, ma frappe util reçoit pas plus de touches. Même si je clique sur le dos de ma fenêtre de la console, ou msvc, je ne reçoit aucun signal. C'est moins que son mondial, alors comment puis-je régler le crochet pour être global?
Mon code est
int main()
{
hook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, GetModuleHandle(0), 0);
MSG msg;
while(GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
UnhookWindowsHookEx(hook);
}
OriginalL'auteur | 2009-01-18
Vous devez vous connecter pour publier un commentaire.
Pour que votre clavier crochet pour être accessible à partir de tous les processus, il doit être placé dans une DLL qui seront ensuite chargés dans chaque espace d'adressage du processus. Une chose importante à garder à l'esprit est que, puisque chaque instance de la DLL est chargée dans un processus distinct, chacun aura sa propre copie de toutes les variables globales dans la DLL. Si vous avez besoin de partager des données entre ces instances, le plus simple est de créer un segment de données partagée dans la DLL. Le code suivant est à partir d'un RSI programme de surveillance que j'ai écrit.
iKeyCount
dans votre exemple. J'aimerais utiliser un mutex nommé pour cela.OriginalL'auteur Ferruccio
Éviter codeproject échantillons. ( beaucoup de bugs, une mauvaise copie de MSDN )
Voir les tonnes d'échantillons complets sur MSDN sur les crochets (MSDN, SDK, KO, etc)
Et vous n'avez pas besoin de DLL, il suffit d'utiliser LL crochets
merci pour la réponse @myst, n'était pas au courant de WH_KEYBOARD_LL avant
OriginalL'auteur
Pour Glopbal Hook Clavier juste pour la Touche de raccourci, puis Registre raccourci est le meilleur (c'est fait par Microsoft):
https://msdn.microsoft.com/en-us/library/windows/desktop/ms646309(v=vs. 85).aspx
Télécharger l'exemple d'application winform et de voir par vous-même:
https://code.msdn.microsoft.com/CppRegisterHotkey-7bd897a8 C++
https://code.msdn.microsoft.com/CSRegisterHotkey-e3f5061e C#
https://code.msdn.microsoft.com/VBRegisterHotkey-50af3179 VB.Net
Application Winform:
HotKeyRegister.cs
KeyModifiers.cs:
OriginalL'auteur Jeremy Thompson
Re-lire l'introduction à crochets dans la Win32 guide. (Un bon endroit pour commencer est ici.)
Plus précisément, si vous voulez brancher des événements dans d'autres processus, vous devez placer votre rappel dans une DLL, ce qui est injecté à d'autres processus par Win32. À partir du code que vous avez fourni, je ne peux pas dire si KeyboardProc est dans une DLL ou dans le programme principal. Il ne ressemble pas à elle, compte tenu de la HINSTANCE vous êtes de passage.
OriginalL'auteur Jim Nelson
J'ai du désordre mondial des crochets quand j'ai écrit une "image dans l'Image" du type d'application. Cet article et l'exemple de code m'a aidé énormément:
http://www.codeproject.com/KB/system/WilsonSystemGlobalHooks.aspx
OriginalL'auteur David Brown