SetWindowsHookEx зависает при быстром вводе или удержании кнопки клавиатуры

У меня проблема с клавиатурным логгером. Каждая система, протестированная до сегодняшнего дня, работает нормально, кроме Windows 7 Embedded Standard 32 бит это очевидно волнуется с текущей сборкой.

Что мне нужно сделать, это записывать нажатия клавиш с клавиатуры, пока я не получу определенное количество из них. Когда я это делаю, я вызываю определенную процедуру.

У меня есть крюк, определенный следующим образом:

SetWindowsHookEx(WH_KEYBOARD_LL, keyboardProcedure, GetModuleHandle(NULL), 0);

и обратный вызов клавиатуры Procedure:

LRESULT CALLBACK SystemKeyboardReadWrite::keyboardProcedure(int nCode, WPARAM wParam, LPARAM lParam)
{
...
}

Я использую Qt 5.2 для этого приложения.

Итак, более подробно, проблема возникает, когда вы слишком быстро вводите клавиши или удерживаете определенную клавишу в течение более длительного периода времени, что заставит клавиатуру отправлять несколько событий клавиатуры. Когда это произойдет, ловушка будет зависать и больше не отправлять события обратному вызову. (не все приложение, приложение будет продолжать работать, за исключением кейлоггера)

Эта проблема возникает только в этой ОС, ни в одной другой ОС Windows 7 или Windows XP, я не заметил эту проблему. У меня есть 2 компьютера с одинаковой настройкой, и они оба показывают ту же проблему, также я разрабатываю приложение для Windows 7 Professional, и это также кажется нормальным.
Мне интересно, если это проблема с моим приложением, или это что-то вне моего контроля.

Спасибо всем за помощь.

2

Решение

Я не знаю Windows Embedded, но я знаком с Windows 7 и LowLevel Hooks, как мышью, так и клавиатурой.

Признак исключения из списка подключений можно уменьшить / изменить с помощью значения реестра LowLevelHooksTimeOut. Вы должны перезагрузить систему после ее изменения. По сути, это значение указывает количество миллисекунд, с которыми хуки должны взаимодействовать с ключами.

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

Например, вы получаете 100 нажатий клавиш, а затем записываете их в файл. Если они удерживают клавиши в диапазоне от 100 до 101+, и вы тратите больше времени, чем максимальное время с ловушкой, тогда Windows внесет в черный список ваш обратный вызов ловушки и исключит вас из списка ловушек.

Время по умолчанию в Windows 7 (рабочий стол) составляет 200 мс, я думаю. Для встроенного я не удивлюсь, если он меньше. Кроме того, когда все программы подключают клавиатуру, это может повлиять на то, как долго ваш хук может получить к ней доступ.

Я также использовал только те хуки, которые установлены в dll и держатся за глобальный дескриптор HHOOK. Просмотр всех кодов возврата ваших функций также может пролить свет на ситуацию.

Больше информации о LowLevelHooksTimeout:

Низкоуровневый Keyboard Hook работает на одном на Windows 7 x64, а не на другом

2

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


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