我从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)
{
}
答案 0 :(得分:2)
while(true) {}
这是一个hold-and-catch-fire语句,该线程将烧掉100%的核心并且无法执行钩子回调。当您按下某个键时,您会注意到机器已经死了5秒钟,操作系统正在等待调用回调的机会。但它不会永远等待,毫不客气地会破坏钩子,让你重新掌控机器。此外,当您尝试调试事件处理程序时将发生的事故。
Windows需要有机会安全地调用钩子回调。这要求你的程序空闲"不执行任何代码。其技术术语是“#34;泵送消息循环"”,您的程序必须等待操作系统发出有趣的事件通知。
一种非常简单的方法是按原样使用Winforms项目模板,您还可以获得一个窗口。注意项目中的Main()方法如何进行所需的调用而不是while()循环。您必须致电Application.Run()
。
检查this post以获取避免显示窗口的代码。