首頁 >後端開發 >C++ >為什麼我的 WPF 全域鍵盤掛鉤停止運作,如何修復它?

為什麼我的 WPF 全域鍵盤掛鉤停止運作,如何修復它?

Susan Sarandon
Susan Sarandon原創
2024-12-29 01:27:14226瀏覽

Why Does My WPF Global Keyboard Hook Stop Working, and How Can I Fix It?

在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();
    }
}

在此更新的程式碼中:

  1. LowLevelKeyboardProc 委託被宣告為名為hookCallback 的私有欄位。
  2. 在 Application_Startup 方法中,hookCallback 委託作為參數傳遞給KeyboardListener 建構子。
  3. KListener 實例已創建,並使用實例建構子引用回調。

透過維護對委託的引用,回呼函數將保留在範圍內並將繼續按預期接收鍵盤事件,解決了鉤子在一段時間後停止工作的問題。

以上是為什麼我的 WPF 全域鍵盤掛鉤停止運作,如何修復它?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn