C ++ SetWindowsHookEx WH_KEYBOARD_LL korrekte Einstellung
-
24-09-2019 - |
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);
}
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