[英]Key listener not firing (MouseKeyHook)
我从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()
。
在这篇文章中查看避免显示窗口的代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.