Windows 挂钩不会触发事件并且 windows 开始滞后。 (在 C# 中使用 globalmousekeyhook)
Windows Hooks do not trigger events and windows starts lagging. (Using globalmousekeyhook in C#)
我目前使用 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());
}
您可以找到整个 class(和项目)here。
构造函数是程序中唯一被执行的东西。
关于滞后,我发现事件函数必须很快。在我的情况下这不是问题,因为 Logger.Log()
函数很快,并且在使用 Console.WriteLine()
.
时也会出现滞后
正如我所说,示例程序运行良好。我尝试复制示例代码,但这没有任何区别。我的程序和示例程序之间唯一真正的区别是示例使用 .Net Core 但我使用 .Net Framework (4.8)。这可能是原因吗?如果是这个原因,有没有办法将库与.Net Framework 一起使用?
我期待任何帮助。
有两个问题:
- 您需要一个消息泵才能接收挂钩消息。为此,您可以使用以下代码,如示例中所示 link
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
}
我目前使用 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());
}
您可以找到整个 class(和项目)here。
构造函数是程序中唯一被执行的东西。
关于滞后,我发现事件函数必须很快。在我的情况下这不是问题,因为 Logger.Log()
函数很快,并且在使用 Console.WriteLine()
.
正如我所说,示例程序运行良好。我尝试复制示例代码,但这没有任何区别。我的程序和示例程序之间唯一真正的区别是示例使用 .Net Core 但我使用 .Net Framework (4.8)。这可能是原因吗?如果是这个原因,有没有办法将库与.Net Framework 一起使用? 我期待任何帮助。
有两个问题:
- 您需要一个消息泵才能接收挂钩消息。为此,您可以使用以下代码,如示例中所示 link
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
}