SetWindowsHookEx
withを介してインストールされたいくつかのグローバル キーボード フックWH_KEYBOARD_LL
があり、Windows によってランダムにフック解除されるようです。
UnhookWindowsHookEx
ハンドルを呼び出すと が返されるため、フックがアタッチされなくなったことを確認しましたfalse
。true
(正常に動いていた時に戻ることも確認済み)
一貫した再現性はないようです。タイムアウトや例外がスローされたためにフックが外れる可能性があると聞きましたが、処理メソッドのブレークポイントに1分以上置くだけで両方を試しました.ランダムな例外 (C#) をスローするだけでなく、それでも動作しているように見えます。
コールバックでは、すぐに別のスレッドに投稿するので、おそらく問題にはなりません。Windows 7は明らかにタイムアウトについてより積極的であるため、レジストリでタイムアウトをより高く設定するためのWindows 7のソリューションについて読みました(ここではすべてWin7を実行しているため、これが他のOSで発生するかどうかはわかりません)が、そうではありません理想的な解決策とは思えません。
バックグラウンド スレッドを実行してフックを時々更新することを検討しましたが、これはハックですが、それを行うことによる実際の悪影響については知りません。Windows のグローバル レジストリ設定を変更するよりも優れているようです。 .
他の提案や解決策はありますか? フックを設定するクラスとそれらがアタッチされているデリゲートはどちらも静的であるため、GC を取得するべきではありません。
編集:GC.Collect();
それらがまだ機能していることを呼び出して検証したため、ガベージ収集されていません。