Domanda

Sto creando un'applicazione console in cui mi piacerebbe registrare le pressioni dei tasti (come la freccia). Ho creato un hook di tastiera di livello basso che dovrebbe catturare tutti i tasti in qualsiasi discussione e richiamare la mia funzione di callback, ma non sta funzionando. Il programma di stalle per un po 'quando ho colpito una chiave, ma non richiama il callback. Ho controllato la documentazione, ma non ho trovato nulla. Non so se sto usando SetWindowsHookEx () in modo non corretto (a mia conoscenza si crea con successo il gancio) o la mia funzione di callback non è corretta! Non sono sicuro che cosa è sbagliato! Grazie in anticipo per l'aiuto.

#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);
}
È stato utile?

Soluzione

Non si può bloccare su una chiamata di sistema (la getchar), si deve essere in esecuzione un ciclo finestra e l'elaborazione di messaggi prima che il gancio viene chiamato.

Altri suggerimenti

In Windows XP, è necessario, è necessario passare hInstance (da WinMain) come il terzo argomento di SetWindowsHookEx. Ad esempio:

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

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

// ...

vi suggerisco simle prima;

// VB: recuperare l'istanza applicazioni   HINSTANCE appInstance = GetModuleHandle (NULL);

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

// ..., ma ci sono altri errori più tardi, troppo

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top