C++ SetWindowsHookEx WH_KEYBOARD_LL de Configuration Correct
Je suis de la création d'une application console dans laquelle j'aimerais enregistrer les frappes au clavier (comme la FLÈCHE vers le HAUT). J'ai créé un Faible Niveau de Hook Clavier qui est censé capturer toutes les frappes de Touche dans n'importe quel thread et d'appeler ma fonction de callback, mais il ne fonctionne pas. Le programme des stands pour un peu, quand j'appuie sur une touche, mais jamais appelle la fonction de rappel. J'ai vérifié la documentation mais je n'ai pas trouvé quoi que ce soit. Je ne sais pas si je suis en utilisant SetWindowsHookEx() incorrecte (à ma connaissance il réussit à créer le crochet) ou ma fonction de callback est incorrect! Je ne suis pas sûr de ce qui est faux! Merci d'avance pour l'aide.
#include "Windows.h"
#include <iostream>
using namespace std;
HHOOK hookHandle;
LRESULT CALLBACK keyHandler(int nCode, WPARAM wParam, LPARAM lParam);
int _tmain(int argc, _TCHAR* argv[]) {
hookHandle = SetWindowsHookEx(WH_KEYBOARD_LL, keyHandler, NULL, 0);
if(hookHandle == NULL) {
cout << "ERROR CREATING HOOK: ";
cout << GetLastError() << endl;
getchar();
return 0;
}
MSG message;
while(GetMessage(&message, NULL, 0, 0) != 0) {
TranslateMessage( &message );
DispatchMessage( &message );
}
cout << "Press any key to quit...";
getchar();
UnhookWindowsHookEx(hookHandle);
return 0;
}
LRESULT CALLBACK keyHandler(int nCode, WPARAM wParam, LPARAM lParam) {
cout << "Hello!" << endl;
//Checks whether params contain action about keystroke
if(nCode == HC_ACTION) {
cout << ((KBDLLHOOKSTRUCT *) lParam)->vkCode << endl;
}
return CallNextHookEx(hookHandle, nCode,
wParam, lParam);
}
OriginalL'auteur Mahir | 2010-01-30
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas bloquer sur un syscall (getchar), vous devez être en cours d'exécution d'une fenêtre de la boucle et le traitement des messages avant votre crochet est appelée.
msdn.microsoft.com/en-us/library/aa383682(SV.85).aspx est un bon exemple
Merci, je vais poster de nouveau dans quelques minutes si je suis toujours avoir des problèmes.
Donc, fondamentalement, une Boucle de Message envoie à l'application de la file d'attente des messages à ses crochets? J'ai travaille maintenant! Merci. Le code que j'ai posté contient le correctif.
OriginalL'auteur Paul Betts
Sur Windows XP, vous avez besoin, vous devez passer
hInstance
(à partir deWinMain
) comme troisième argument deSetWindowsHookEx
. Par exemple:OriginalL'auteur mpb
Je suggère simle premier;
//VB: Récupérer les applications de l'instance
HINSTANCE appInstance = GetModuleHandle(NULL);
et puis:
hookHandle = SetWindowsHookEx(WH_KEYBOARD_LL, keyHandler, appInstance, 0);
//..., mais il y a encore des erreurs, aussi, plus tard
OriginalL'auteur user3620571