WPF / C# でのグローバル キーボード フック (WH_KEYBOARD_LL) の使用: コールバックが消えるトラブルシューティング
提供されたコードでは、グローバル キーボード フックが確立されていますSetHook メソッドを使用します。ただし、SetHook 呼び出しでインラインで定義されたフック デリゲートが適切に参照されず、ガベージ コレクションされる可能性があるという潜在的な問題があります。これにより、コールバック関数が失敗し、それ以上キーボード イベントが受信されなくなります。
解決策:
この問題を解決するには、コールバック デリゲートを明示的に作成する必要があります。そしてアプリケーション内でそれへの参照を保持します。これは、SetHook メソッドの外でデリゲート変数を宣言し、それを引数として渡すことで実行できます。
public class App : Application { private KeyboardListener KListener; private LowLevelKeyboardProc hookCallback; private void Application_Startup(object sender, StartupEventArgs e) { hookCallback = HookCallback; KListener = new KeyboardListener(hookCallback); KListener.KeyDown += new RawKeyEventHandler(KListener_KeyDown); } private void Application_Exit(object sender, ExitEventArgs e) { KListener.Dispose(); } }
この更新されたコードでは、
デリゲートへの参照を維持することで、コールバック関数がはスコープ内に残り、期待どおりにキーボード イベントを受信し続けるため、一定の時間が経過するとフックが機能しなくなる問題が解決されます。
以上がWPF グローバル キーボード フックが機能しなくなるのはなぜですか? どのように修正すればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。