2010-01-30 4 views
5

Je crée une application de console dans laquelle j'aimerais enregistrer des pressions de touches (comme la touche HAUT). J'ai créé un crochet de clavier de bas niveau qui est censé capturer toutes les touches dans n'importe quel thread et appeler ma fonction de rappel, mais cela ne fonctionne pas. Le programme se bloque un peu lorsque j'appuie sur une touche, mais n'invoque jamais le rappel. J'ai vérifié la documentation mais n'ai rien trouvé. Je ne sais pas si j'utilise SetWindowsHookEx() de manière incorrecte (à ma connaissance, il crée avec succès le crochet) ou ma fonction de rappel est incorrecte! Je ne suis pas sûr que ce soit faux! Merci d'avance pour l'aide.C++ SetWindowsHookEx WH_KEYBOARD_LL Configuration correcte

#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); 
} 
+0

S'il vous plaît voir [ici] (http://stackoverflow.com/questions/2127112/global-keyboard-hook-not-working/2127292 # 2127292) pour une question similaire, que j'ai répondu qui vous aidera. – t0mm13b

Répondre

2

Vous ne pouvez pas bloquer sur un syscall (le getchar), vous devez être en cours d'exécution d'une boucle de fenêtre et le traitement des messages avant que votre crochet est appelé.

+0

Comment implémenter une boucle de fenêtre? Je suis très peu familier avec WinAPIs (en fait quel est le but d'une boucle de la fenêtre?) – Mahir

+0

http://msdn.microsoft.com/en-us/library/aa383682(VS.85).aspx est un bon exemple –

+0

Merci , Je posterai dans quelques minutes si j'ai toujours des problèmes. – Mahir

0

Sous Windows XP, vous devez passer hInstance (de WinMain) comme troisième argument à SetWindowsHookEx. Par exemple:

int WINAPI WinMain 
(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
    LPTSTR lpCmdLine, int nCmdShow) { 

    hookHandle = SetWindowsHookEx (WH_KEYBOARD_LL, keyHandler, hInstance, 0); 

// ... 
0

Je suggère d'abord simle; // VB: Récupération de l'instance d'application HINSTANCE appInstance = GetModuleHandle (NULL);

puis: hookHandle = SetWindowsHookEx (WH_KEYBOARD_LL, keyHandler, appInstance, 0);

// ..., mais il y a encore des erreurs plus tard, trop

Questions connexes