键侦听器未触发(MouseKeyHook)

时间:2015-06-06 02:41:02

标签: c# windows 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)
    {
    }

1 个答案:

答案 0 :(得分:2)

    while(true) {}

这是一个hold-and-catch-fire语句,该线程将烧掉100%的核心并且无法执行钩子回调。当您按下某个键时,您会注意到机器已经死了5秒钟,操作系统正在等待调用回调的机会。但它不会永远等待,毫不客气地会破坏钩子,让你重新掌控机器。此外,当您尝试调试事件处理程序时将发生的事故。

Windows需要有机会安全地调用钩子回调。这要求你的程序空闲"不执行任何代码。其技术术语是“#34;泵送消息循环"”,您的程序必须等待操作系统发出有趣的事件通知。

一种非常简单的方法是按原样使用Winforms项目模板,您还可以获得一个窗口。注意项目中的Main()方法如何进行所需的调用而不是while()循环。您必须致电Application.Run()

检查this post以获取避免显示窗口的代码。