C ++ SetWindowshookex wh_keyboard_ll исправлена настройка
-
24-09-2019 - |
Вопрос
Я создаю приложение консоли, в котором я хотел бы записать ключевые прессы (как стрелка вверх). Я создал крючок клавиатуры с низким уровнем, который должен запечатлеть все ключи, нажимает в любом потоке и вызывает мою функцию обратного вызова, но она не работает. Программа забивает немного, когда я ударю ключ, но никогда не вызывает обратный вызов. Я проверил документацию, но не нашел ничего. Я не знаю, используете ли я SetWindowshookex () неправильно (насколько мне известно, это успешно создает крючок) или мою функцию обратного вызова неверна! Я не уверен, что не так! Заранее спасибо за помощь.
#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);
}
Решение
Вы не можете заблокировать на SYSCALL (GetChar), вы должны выполнять окно петли и обработки сообщений, прежде чем ваш крюк будет вызван.
Другие советы
На Windows XP вам нужно, вам нужно пройти hInstance
(от WinMain
) как третий аргумент SetWindowsHookEx
. Отказ Например:
int WINAPI WinMain
( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow ) {
hookHandle = SetWindowsHookEx ( WH_KEYBOARD_LL, keyHandler, hInstance, 0 );
// ...
Я предлагаю Simle первым;
// VB: Получить экземпляр приложений Hinstance AppInstance = GetModuleHandle (NULL);
а затем: cookhandle = setwindowshookex (wh_keyboard_ll, keyhandler, appinstance, 0);
// ..., но есть еще одно ошибки позже, тоже