我编写了一个自定义 Windows 控件,用于处理文本输入的
WM_CHAR
消息和来自箭头、删除、Home 等键的“导航”击键的 WM_KEYDOWN
消息。
我希望我的控件将数字键盘上的
+
和 -
键处理为导航键。 它们与键盘主要部分上的常规 =+
和 -_
键不同,因为它们具有独特的虚拟键代码(VK_ADD
和 VK_SUBTRACT
),因此在我的 WM_KEYDOWN
中处理它们效果很好。
当然,问题在于控件还会接收这些击键的
WM_CHAR
消息,因为消息循环中的 TranslateMessage()
调用将它们视为生成文本的常规键。 由于我的控件位于可能被各种应用程序使用的库中,因此消息循环超出了范围。
因此,我的
WM_CHAR
处理程序需要能够区分主键盘生成的 +
和 -
字符以及数字小键盘生成的字符,以便它可以忽略后者。
但是
WM_CHAR
中的字符代码确实是字符代码,不再是虚拟键代码。 我尝试检查元数据中的“扩展密钥”位,但显然这些不是扩展密钥。
WM_CHAR
文档表示扫描代码因 OEM 而异。 但键盘输入概述文档表明扫描代码已在 HID 规范中标准化。
我可以相信我总能获得 HID 扫描码吗?
从我的 Microsoft 键盘生成的代码确实与 HID 值匹配,但文档中的冲突让我想知道我是否真的可以在其他机器上依赖它。
我的后备解决方案是在处理
VK_ADD
或 VK_SUBTRACT
时添加控制注释,以便它知道忽略下一个 WM_CHAR
以及相应的 +
或 -
。