Windows挂钩不会触发事件,并且窗口开始滞后.(在C#中使用globalmousekeyhook)



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

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

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

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

滞后和延迟只持续了大约半分钟。

我怀疑windows删除挂钩是因为它检测到了滞后。

我也尝试了这个示例程序,在那里一切都很好。

这是代码:

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());
}

你可以在这里找到整个课程(和项目(。

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

关于滞后,我发现事件函数必须很快。在我的情况下,这不会是问题所在,因为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
}

最新更新