要使 Numpad Enter 被识别为任一类型的 Enter,键盘硬件必须发送映射到当前键盘布局VK_RETURN
内的扫描代码。键盘布局由系统设置和接收键盘输入(或用户)的窗口决定,而不是由物理键盘决定。虚拟键盘布局很可能与物理键盘不匹配(即按键上的标签与其功能不匹配)。
有两种策略可以让不同的物理键盘布局正常工作:
- 更改按键上可见的标签,但将扫描码保持在相同的物理位置。为了使每个键的功能与其标签相匹配,用户必须在软件中选择、安装或创建正确的键盘布局。
- 物理移动按键,或将预先建立的扫描码分配到不同的物理位置。操作系统不知道也不关心任何密钥的物理位置;它只是根据当前的键盘布局将扫描码映射到虚拟键码。
Enter 和 Numpad Enter 都映射到VK_RETURN
; Numpad Enter 没有保留虚拟键码,因此无法在不同的键盘布局上使用不同的扫描码。使用策略#1,任何键都可以变成Enter,但不是专门的Numpad Enter。使用策略#2,Numpad Enter 仍然像往常一样具有相同的扫描码。
在硬件级别,Enter 发送0x1C
,而 Numpad Enter 发送0xE0 0x1C
(来源:我自己的观察和Andries Brouwer 的文档)。Windows 有不同的报告方式:使用WM_KEYDOWN
's 的第24 位lParam
,低级键盘挂钩的LLKHF_EXTENDED
标志,原始输入的标志,可能还有更多。RI_KEY_E0
简而言之,假设 Numpad Enter 是 0x1C 加上扩展键标志是安全的,因为在任何其他情况下,都无法识别。
我知道在我的键盘上是 0x9C (156)
我假设您从DirectInputDIK_NUMPADENTER
收到了这个值,它定义了一个值为 0x9C的枚举常量。此值不是扫描码。