Winapi — Win32 C ++ Низкоуровневая клавиатура Hook вызывает странное поведение

У меня возникла проблема при попытке использовать клавиатуру. То, что я пытаюсь сделать (и делает) из любого окна / фокуса, я могу нажать клавишу, которая запускает функцию (которая перемещает мышь и щелкает).

С фронта все работает нормально, но как только я начинаю что-то делать, все становится странно (даже после закрытия проблемы).

В Firefox будет «выбрать и выделить все, где находится мышь, когда я нажимаю»; если я пытаюсь печатать, все числовые символы появляются, как будто кнопка Shift была нажата, и никак не обойти ее. Если я нажимаю на мой компилятор на панели задач (wxDev C ++), он автоматически запускает новый экземпляр программы.

Это только начало проблем, я перезагружаю свой компьютер, чтобы снова получить нормальное поведение.

Я полагаю, что я могу использовать это неправильно:

В Int WinMain:

keyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hThisInstance, 0);

В основной процедуре:

case WM_KEY_WPARAM_VK:
keyid = wParam; // 65 == 'a'
letterid = keyid - 65;
if ('a'+letterid == 'q') {  DoFunction(); }
return 0;

Так что когда я нажимаю q на клавиатуре, функция вызывается.

Это процедура, я пытаюсь не блокировать клавиатуру от ввода (поэтому я добавил дополнительную строку.) Я не могу понять это …

LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam ) {
KBDLLHOOKSTRUCT *pKeyBoard = (KBDLLHOOKSTRUCT *)lParam;
// When a key is pressed
if (WM_KEYDOWN == wParam) {
PostMessage(hWnd, WM_KEY_WPARAM_VK, pKeyBoard->vkCode, 0);
CallNextHookEx(keyboardHook, pKeyBoard->vkCode, 0, 0);
}
}

Спасибо за прочтение.

1

Решение

Вам нужно поставить CallNextHookEx функционировать вне if заявление! (а также обновить его, чтобы правильно пройти wParam а также lParam до следующего крючка)

return CallNextHookEx(keyboardHook, pKeyBoard->vkCode, wParam, lParam);

Как у вас сейчас, ваш код будет блокировать все нажатия клавиш в остальной части ОС, отсюда и странное поведение.

Это абсолютно необходимо, чтобы CallNextHookEx вызывается независимо от того, что вы делаете в ловушке. Я также избегал бы выполнения каких-либо длительных (блокирующих) операций, когда вы внутри вашего хука.

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]