MS что-то изменила в зацепках клавиатуры в Windows Vista или 7? - PullRequest
1 голос
/ 08 октября 2010

Я реализовал перехват клавиш на нескольких языках (AutoIt, C #), используя SetWindowsHookEx и WH_KEYBOARD_LL. Я также знаю пару программ на C ++, имеющих ту же проблему.

Я не публиковал код, потому что он отлично работает в Windows XP. Однако в Windows 7 в какой-то момент хуки становятся «выгруженными» или перестают обрабатывать любые дальнейшие ключи. Кажется, это может быть связано с нехваткой памяти, но я не совсем уверен.

Microsoft изменила способ работы клавиатурных хуков в Vista или 7, чтобы добавить логику, которая при определенных обстоятельствах могла бы выгружать сторонние хуки?


Похожие вопросы:

как перезапустить мышиный крючок?
Обнаружение зацепов клавиатуры

Ответы [ 2 ]

3 голосов
/ 08 октября 2010

Ну, это было много, когда UAC был реализован в Vista. Тем не менее, это не частая жалоба. Да, для Windows вполне возможно прекратить обратный вызов перехвата. Встроенная функция, предотвращающая перехват операционной системы, когда есть один перехватчик, который не обрабатывает обратный вызов своевременно. Он автоматически удаляется из списка обратных вызовов без какой-либо диагностики.

Это основано на тайм-ауте и может действительно отключиться, когда ОС начинает исчерпывать ресурсы. Как нехватка оперативной памяти и запуск множества процессов, получение массивного подкачки. Более вероятно с более поздними версиями Windows, так как им требуется больше оперативной памяти и, как правило, они страдают при обновлении машины вместо ее очистки перед установкой из-за проблем фрагментации диска (особенно файла подкачки).

Настройка времени ожидания может быть изменена путем добавления значения HKCU \ Control Panel \ Desktop \ LowLevelHooksTimeout (DWORD, скажем, 10000). Задайте больше вопросов об этом на superuser.com

1 голос
/ 05 января 2011

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

Вот ссылка на мой код , если вам интересно.

...