【发布时间】:2016-06-03 16:11:50
【问题描述】:
我使用 globalKeyboardHook 来检测某些键盘键。 键盘是标准的英文 Microsoft 101 键。 对于多种语言,我需要所有字母表(无数字)和标点符号(句点逗号 [ ] + = _ - ' ; 和一些类似的。 我不希望包含控制字符。
为了过滤我需要的键,我使用了 char.Isletter || char.is 标点符号。 令我惊讶的是,我发现使用keyboardGlobalHook 时,char.IsPunctuation 不 返回标准标点符号(句点、逗号等)。 似乎返回的 keyCodes 和 keyValues 与钩子不同。 在没有钩子的简单测试程序中运行相同的 char.isPunctuation 时,它会返回正确的 (?) 标点键列表,如下所示:
39 ''':
40 '(':
41 ')':
42 '*':
44 ',':
45 '-':
46 '.':
47 '/':
58 ':':
59 ';':
63 '?':
64 '@':
91 '[':
92 '\':
93 ']':
95 '_':
123 '{':
125 '}':
161 '¡':
171 '«':
173 '-':
183 '·':
187 '»':
191 '¿':
如何使用内置的 char.Is... 过滤器仅过滤我需要的键? (我自然可以列出我需要的所有键,但为此我需要运行全局挂钩并按下每个键以确定返回的代码)。
【问题讨论】:
-
这样的键盘挂钩会产生虚拟键码。它们在世界任何地方都是一样的。它们产生的字符不是,它们取决于用户选择的键盘布局和键盘状态,例如 Shift/Ctrl/Alt 键是否按下以及之前是否按下了 AltGr 等任何死键。这些属性是每个进程的,因此通常不可能使用全局挂钩可靠地做到这一点。你需要一个 WH_KEYBOARD 钩子,因为你不能用 C# 编写一个钩子,所以很难开始。
标签: c# event-hooking