Windows Hooks 不会触发事件并且 Windows 开始滞后 在 C# 中使用 globalmousekeyhook

问题描述

我目前使用 Steelseries GameSense SDK 为我的键盘和鼠标制作我自己的效果等。

为了在点击和按下时点亮我的鼠标和键盘,我使用了 globalmousekeyhook 库。

不幸的是,鼠标和键盘事件没有被触发。

此外,我的鼠标开始滞后,键盘输入延迟。

滞后和延迟只停留大约半分钟。

我怀疑 Windows 删除了钩子,因为它检测到了延迟。

我也试过 this example program 并且一切正常。

代码如下:

private static readonly IKeyboardMouseEvents GlobalHook = Hook.GlobalEvents();
static InputManager()
{
    Logger.Log("Starting...",Logger.Type.Info);
    GlobalHook.KeyDown += KeyEvent;
    GlobalHook.MouseDownExt += MouseEvent;
    Logger.Log("Ready!",Logger.Type.Info);
}

和事件函数

private static void KeyEvent(object sender,KeyEventArgs eventArgs)
{
    Logger.Log(eventArgs.KeyCode.ToString());
}
private static void MouseEvent(object sender,MouseEventArgs eventArgs)
{
    Logger.Log(eventArgs.Button.ToString());
}

您可以找到整个班级(和项目)here

构造函数是程序中唯一被执行的东西。

我发现关于滞后的是事件函数必须很快。就我而言,这不是问题,因为 Logger.Log() 函数速度很快,而且在使用 Console.WriteLine() 时也会出现延迟。

正如我所说,示例程序运行良好。我尝试复制示例代码,但这没有任何区别。我的程序和示例程序之间唯一真正的区别是示例使用 .Net Core,但我使用 .Net Framework (4.8)。这可能是原因吗?如果是这个原因,有没有办法在.Net Framework 中使用该库? 我期待任何帮助。

解决方法

有两个问题:

  • 您需要一个消息泵才能接收挂钩消息。为此,您可以使用以下代码,如您链接的示例所示
Application.Run(new ApplicationContext());
  • 您现在有两件事要尝试在同一线程上执行:抽取消息并等待输入。相反,将它们拆分为不同的线程:
private static void Main(string[] args)
{
    Logger.Log("Program started. Welcome.",Logger.Type.Info);
    ////GameSense.Controller.Start();
    new Thread(() => Console.ReadLine()).Start();
            
    InputManager.Start();
    
    Application.Run(new ApplicationContext());
    InputManager.End();
    Application.Exit();  // needed to close down the message pump and end the other thread
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...