2010-01-30 17 views
5

Estoy creando una aplicación de consola en la que me gustaría grabar pulsaciones de teclas (como la FLECHA HACIA ARRIBA). Creé un gancho de teclado de bajo nivel que se supone que captura todas las pulsaciones de teclas en cualquier hilo e invoca mi función de devolución de llamada, pero no funciona. El programa se detiene un poco cuando presiono una tecla, pero nunca invoca la devolución de llamada. Revisé la documentación pero no encontré nada. No sé si estoy usando SetWindowsHookEx() de forma incorrecta (que yo sepa, crea correctamente el enlace) o si mi función de devolución de llamada es incorrecta. No estoy seguro de lo que está mal! Gracias de antemano por la ayuda.C++ SetWindowsHookEx WH_KEYBOARD_LL Configuración correcta

#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

favor ver [aquí] (http://stackoverflow.com/questions/2127112/global-keyboard-hook-not-working/2127292 # 2127292) para una pregunta similar, que respondí que te ayudará. – t0mm13b

Respuesta

2

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.

+0

¿Cómo implementaría un bucle de ventana? No estoy muy familiarizado con WinAPI (de hecho, ¿cuál es el propósito de un bucle de ventana?) – Mahir

+0

http://msdn.microsoft.com/en-us/library/aa383682(VS.85).aspx es un buen ejemplo –

+0

Gracias , Publicaré en un par de minutos si todavía tengo problemas. – Mahir

0

En Windows XP, necesita, que necesita para 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); 

// ... 
0

Sugiero simle first;

// VB: Recupere la instancia de las aplicaciones HINSTANCE appInstance = GetModuleHandle (NULL);

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

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

Cuestiones relacionadas