Pregunta

Estoy creando una aplicación de consola en la que me gustaría grabar pulsaciones de teclas (como la flecha hacia arriba). He creado un gancho de teclado de bajo nivel que se supone para capturar todas las pulsaciones de teclas en cualquier tema e invocar mi función de devolución de llamada, pero no está funcionando. El programa atasca un poco cuando me golpeó una llave, pero nunca se invoca la devolución de llamada. He revisado la documentación, pero no he encontrado nada. No sé si estoy usando SetWindowsHookEx () de forma incorrecta (que yo sepa que crea con éxito el gancho) o de mi función de devolución es incorrecto! No estoy seguro de cuál es incorrecto! Gracias de antemano por la ayuda.

#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);
}
¿Fue útil?

Solución

No se puede bloquear en una llamada al sistema (el getchar), usted tiene que estar ejecutando un bucle ventana y el procesamiento de los mensajes antes de su gancho es llamado.

Otros consejos

En Windows XP, necesita, necesita pasar hInstance (de WinMain) como el tercer argumento a SetWindowsHookEx. Por ejemplo:

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

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

// ...

Me sugieren simle primera;

// VB: Recuperar la instancia aplicaciones   HINSTANCE appInstance = GetModuleHandle (NULL);

y, a continuación: hookHandle = SetWindowsHookEx (WH_KEYBOARD_LL, keyHandler, appInstance, 0);

// ..., pero hay otros errores más tarde, también

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top