Question

Je crée une application console dans laquelle je voudrais enregistrer touches (comme la flèche UP). J'ai créé un crochet de clavier de bas niveau qui est censé capturer toutes les touches dans un fil et appeler ma fonction de rappel, mais il ne fonctionne pas. Le programme stalles pour un peu quand je frappe une clé, mais invoque jamais le rappel. J'ai vérifié la documentation, mais ne l'ai pas trouvé quoi que ce soit. Je ne sais pas si j'utilise SetWindowsHookEx () de façon incorrecte (à ma connaissance, il crée avec succès le crochet) ou ma fonction de rappel est incorrect! Je ne sais pas ce qui est erroné! 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);
}
Était-ce utile?

La solution

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é.

Autres conseils

Sous Windows XP, vous avez besoin, 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 );

// ...

Je suggère simle d'abord;

// VB: Récupérer l'instance applications   HINSTANCE appinstance = GetModuleHandle (NULL);

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

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top