c# - Windows Hooks 不会触发事件并且 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
}
推荐阅读
- python - 具有自定义渐变着色的单个堆叠条形图
- android - 是否可以在不知道 Firebase 数据库中的两个自动生成的键中获取值?
- forms - Delphi Application.CreateForm 是每个表单的唯一句柄吗?
- excel - 使用自动过滤器搜索数组中的任何字符串
- php - 如何为整个应用程序使用带有依赖注入的记录器?
- sql - 需要选择查询来查找空值
- javascript - 如何从 Slick Slider 中删除类?
- python - 以一定概率翻转标签用于ak最近邻算法的鲁棒性测试
- sql - 如何根据列使用 FOR XML PATH 将 SQL 中的多个嵌套 XML 分组
- javascript - 有没有办法使用扩展运算符合并两个对象,使得结果具有一个对象的键,但具有第二个对象的值?