如何防止 WM_KEYDOWN 处理的按键出现 WM_CHAR?

问题描述 投票:0回答:1

我编写了一个自定义 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
以及相应的
+
-

winapi keyboard user-controls
1个回答
0
投票

WM_KEYDOWN
WM_CHAR
都会给您相同的扫描码,因此应该不难忽略已经向您发送了
WM_CHAR
的扫描码消息
WM_KEYDOWN
等,无论它们是否是标准化与否。每个键盘的扫描码不会改变。
但是,可能有多个键盘(很少见,但有可能),并且无法区分这些窗口消息中的多个键盘,只有

Raw Input API

可以做到这一点。

© www.soinside.com 2019 - 2024. All rights reserved.