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