键监听器未触发(MouseKeyHook)

本文关键字:MouseKeyHook 监听器 | 更新日期: 2023-09-27 17:53:41

我从c#开始,在Java中编写了很多代码,但在这里遇到了一些麻烦。我正在努力学习如何使用MouseKeyHook为我正在开发的应用程序。我无法让实际的监听器触发一个事件。下面是我的监听器代码:

using System;
using System.Windows.Forms;
using Gma.System.MouseKeyHook;
namespace ChromaHeatmap
{
    class keyListener
    {
        private IKeyboardMouseEvents m_GlobalHook;
        public void Subscribe()
        {
            // Note: for the application hook, use the Hook.AppEvents() instead
            m_GlobalHook = Hook.GlobalEvents();
            m_GlobalHook.KeyPress += GlobalHookKeyPress;
        }
        private void GlobalHookKeyPress(object sender, KeyPressEventArgs e)
        {
            Console.WriteLine("blah");
        }
        public void Unsubscribe()
        {
            m_GlobalHook.KeyPress -= GlobalHookKeyPress;
            //It is recommened to dispose it
            m_GlobalHook.Dispose();
        }
    }
}

这是我的应用程序代码的一部分,我试图用侦听器做一些事情。如果有人能告诉我最好的方法是在这里循环并等待事件,我将不胜感激。

    //Listen for key presses
    keyListener heyListen = new keyListener();
    heyListen.Subscribe();
    while(true)
    {
    }

键监听器未触发(MouseKeyHook)

    while(true) {}

这是一个hold-and-catch-fire语句,线程将燃烧100%的内核,并且不能执行钩子回调。您会注意到,当您按下一个键时,机器会死机5秒钟,操作系统正在等待调用回调的机会。但它不会永远等下去,它会毫不客气地毁掉钩子,这样你就能重新控制机器。当您尝试调试事件处理程序时,也会发生这种错误。

Windows需要一个安全地调用钩子回调的机会。这就要求程序处于"空闲"状态,不执行任何代码。这个问题的专业术语是"抽运消息循环",你的程序必须等待操作系统通知发生了一些有趣的事情。

一个非常简单的方法是按原样使用Winforms项目模板,你也会得到一个窗口。请注意项目中的Main()方法是如何进行所需的调用而不是while()循环的。您必须呼叫Application.Run()