Frage

Ich erstelle eine Konsolenanwendung, in der Ich mag würde Tastendrücke aufzeichnen (wie der Pfeil nach oben). Ich habe ein Low-Level-Tastatur-Hook erstellt, die angeblich all Key-Pressen in jedem Thread zu erfassen und invoke meiner Callback-Funktion, aber es funktioniert nicht. Das Programm Stände für ein bisschen, wenn ich eine Taste drücken, aber ruft nie den Rückruf. Ich habe die Dokumentation überprüft, aber habe nichts gefunden. Ich weiß nicht, ob ich SetWindowsHookEx bin mit () falsch (meinem Wissen schafft erfolgreich den Haken) oder meine Callback-Funktion ist falsch! Ich bin nicht sicher, was ist falsch! Vielen Dank im Voraus für die Hilfe.

#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);
}
War es hilfreich?

Lösung

Sie können nicht auf einem syscall blockieren (die getchar), Sie haben ein Fenster Schleife ausgeführt werden, und Verarbeiten von Nachrichten, bevor Sie Ihren Haken aufgerufen wird.

Andere Tipps

Unter Windows XP Sie benötigen, müssen Sie hInstance (von WinMain) als drittes Argument an SetWindowsHookEx zu übergeben. Zum Beispiel:

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

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

// ...

Ich schlage vor, simle zuerst;

// VB: Rufen Sie die Anwendungsinstanz   HINSTANCE appInstance = GetModuleHandle (NULL);

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

// ..., aber es gibt andere Fehler auch später

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top