C# MouseKeyHook:某些键 + 修饰符组合不起作用
C# MouseKeyHook: Certain Key + Modifier Combinations Not Working
我一直在使用 MouseKeyHook NuGet 包,它非常适合捕获大多数输入。但是我在捕捉某些键 + 修饰符的组合时遇到了一些问题。
public static class InputHandler
{
private static IKeyboardMouseEvents _GlobalHook;
public static IKeyboardMouseEvents GlobalHook => _GlobalHook;
public static void Subscribe()
{
_GlobalHook = Hook.AppEvents();
_GlobalHook.KeyDown += KeyDown;
}
private static void KeyDown(object sender, KeyEventArgs e)
{
Console.WriteLine("Output: " + e.Modifiers + " + " + e.KeyCode);
}
}
让我们试着敲几个键,看看输出是什么:
Key: A
> Output: None + A
Key: Shift & A
> Output: Shift + A
Key: Shift & Control & Alt & A
> Output: Shift, Control, Alt + A
太棒了!正是您所期望的。现在键盘顶部的数字栏呢?
Key: 1
> Output: None + D1
Key: Shift & Control & Alt & 3
> Output: Shift, Control, Alt + D3
好的,再一次,正是您所期望的。没问题...
0键呢?
Key: 0
> Output: None + D0
Key: Shift & 0
> Output: Shift + D0
Key: Shift & Control & 0
> Output: Shift, Control + ShiftKey <---- What????
Key: Shift & Control & Alt & 0
> Output: Shift, Control, Alt + D0
那么这是怎么回事?为什么在按下 exactly D0 + Control + Shift 时事件没有正确触发?同样值得注意的是,这是一个 KeyDown 事件,因此只要您按住键,输出就会重复,但是当打印 "ShiftKey" 输出时,它永远不会重复,这很奇怪。
最坏的情况,我总是可以切换我的绑定,但我注意到许多不同的键 + 修饰符组合(主要是 oem 键、小键盘和数字栏)有这种奇怪之处,所以最好知道为什么会这样。
我想到了两种可能:
可能是操作系统键盘快捷键。
许多键盘在物理上无法正确检测每一种可能的键组合。具体细节取决于键盘电路板的布局方式。 Shift-A 或 Ctrl-X 将始终有效,同时按住每个键只适用于最高级的键盘,中间有一个灰色区域。
https://en.wikipedia.org/wiki/Rollover_(key)#Key_jamming_and_ghosting
我一直在使用 MouseKeyHook NuGet 包,它非常适合捕获大多数输入。但是我在捕捉某些键 + 修饰符的组合时遇到了一些问题。
public static class InputHandler
{
private static IKeyboardMouseEvents _GlobalHook;
public static IKeyboardMouseEvents GlobalHook => _GlobalHook;
public static void Subscribe()
{
_GlobalHook = Hook.AppEvents();
_GlobalHook.KeyDown += KeyDown;
}
private static void KeyDown(object sender, KeyEventArgs e)
{
Console.WriteLine("Output: " + e.Modifiers + " + " + e.KeyCode);
}
}
让我们试着敲几个键,看看输出是什么:
Key: A
> Output: None + A
Key: Shift & A
> Output: Shift + A
Key: Shift & Control & Alt & A
> Output: Shift, Control, Alt + A
太棒了!正是您所期望的。现在键盘顶部的数字栏呢?
Key: 1
> Output: None + D1
Key: Shift & Control & Alt & 3
> Output: Shift, Control, Alt + D3
好的,再一次,正是您所期望的。没问题... 0键呢?
Key: 0
> Output: None + D0
Key: Shift & 0
> Output: Shift + D0
Key: Shift & Control & 0
> Output: Shift, Control + ShiftKey <---- What????
Key: Shift & Control & Alt & 0
> Output: Shift, Control, Alt + D0
那么这是怎么回事?为什么在按下 exactly D0 + Control + Shift 时事件没有正确触发?同样值得注意的是,这是一个 KeyDown 事件,因此只要您按住键,输出就会重复,但是当打印 "ShiftKey" 输出时,它永远不会重复,这很奇怪。
最坏的情况,我总是可以切换我的绑定,但我注意到许多不同的键 + 修饰符组合(主要是 oem 键、小键盘和数字栏)有这种奇怪之处,所以最好知道为什么会这样。
我想到了两种可能:
可能是操作系统键盘快捷键。
许多键盘在物理上无法正确检测每一种可能的键组合。具体细节取决于键盘电路板的布局方式。 Shift-A 或 Ctrl-X 将始终有效,同时按住每个键只适用于最高级的键盘,中间有一个灰色区域。
https://en.wikipedia.org/wiki/Rollover_(key)#Key_jamming_and_ghosting