键监听器未触发(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)
{
}
while(true) {}
这是一个hold-and-catch-fire语句,线程将燃烧100%的内核,并且不能执行钩子回调。您会注意到,当您按下一个键时,机器会死机5秒钟,操作系统正在等待调用回调的机会。但它不会永远等下去,它会毫不客气地毁掉钩子,这样你就能重新控制机器。当您尝试调试事件处理程序时,也会发生这种错误。
Windows需要一个安全地调用钩子回调的机会。这就要求程序处于"空闲"状态,不执行任何代码。这个问题的专业术语是"抽运消息循环",你的程序必须等待操作系统通知发生了一些有趣的事情。
一个非常简单的方法是按原样使用Winforms项目模板,你也会得到一个窗口。请注意项目中的Main()方法是如何进行所需的调用而不是while()循环的。您必须呼叫Application.Run()