У нас есть несколько глобальных клавиатурных хуков, установленных через SetWindowsHookEx
с WH_KEYBOARD_LL
, которые, по-видимому, случайным образом отсоединяются от Windows.
Мы убедились, что перехватчик больше не подключен, потому что вызов UnhookWindowsHookEx
на дескрипторе возвращает false
. (Также проверено, что он возвращает true
, когда он работал должным образом)
Кажется, что нет последовательного воспроизведения, я слышал, что они могут отцепиться из-за тайм-аутов или исключений, но я попробовал оба варианта, просто оставив его на точке останова в методе обработки для более минуту, а также просто выбрасывает случайное исключение (C #), и оно все еще работает.
В нашем обратном вызове мы быстро отправляем сообщения в другую ветку, так что, вероятно, проблема не в этом. Я читал о решениях в Windows 7 для установки превышения времени ожидания в реестре, потому что Windows 7, по-видимому, более агрессивна в отношении времени ожидания (мы все запускаем Win7 здесь, поэтому не уверены, происходит ли это на других ОС), но не кажется идеальным решением.
Я подумал о том, чтобы просто запустить фоновый поток, чтобы периодически обновлять ловушку, что является хакерским, но я не знаю каких-либо реальных негативных последствий этого, и это кажется лучше, чем изменение глобального Настройка реестра Windows.
Какие-либо другие предложения или решения? И класс, который устанавливает хуки, и делегаты, к которым они присоединены, являются статическими, поэтому они не должны получать GC'd.
РЕДАКТИРОВАТЬ: подтвердил с звонками на GC.Collect();
, что они все еще работают, поэтому они не получают наряды.