首页 >后端开发 >C++ >为什么我的 WPF 全局键盘挂钩停止工作,如何修复它?

为什么我的 WPF 全局键盘挂钩停止工作,如何修复它?

Susan Sarandon
Susan Sarandon原创
2024-12-29 01:27:14203浏览

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