我想在我的程序中添加某些行为,将某个功能绑定到numpad Enter键(如果存在),或者将备用键绑定(如果不存在)。
扫描代码是键盘硬件在以下情况下生成的值 用户按下一个键。它是一个与设备有关的值,用于标识 与该键所代表的字符相反,所按下的键。 应用程序通常会忽略扫描代码。相反,它使用 与设备无关的虚拟键代码来解释击键消息。
我知道在 my 键盘上它是0x9C(156),但这可以保证对所有键盘都适用。
我不能将MapVirtualKey()
与VK_RETURN
和MAPVK_VK_TO_VSC
一起使用,因为它总是返回键盘中央的主返回键的扫描代码。
如何在无需用户干预的情况下获取此信息?
我的语言是C / C ++,仅适用于Win32。
答案 0 :(得分:1)
扫描代码取决于硬件,在不同的系统上可能不同。可以有多个映射到虚拟密钥的扫描代码。虚拟密钥应该是通用的,并且与硬件无关。
您可以分辨出WM_KEYDOWN
和WM_KEYUP
的区别;当使用数字键盘上的 Enter 键时,WPARAM
是VK_RETURN
,并且LPARAM
中的第24位已设置:
指示该键是否为扩展键,例如出现在增强型101键或102键键盘上的右侧ALT和CTRL键。如果是扩展键,则值为1;否则为0。否则为0。
GetKeyboardType
可以告诉您一些有关“键盘”的信息,但是由于如今连接的键盘不止一个,因此您必须更深入地了解是否有任何键盘具有您所需要的属性。寻找。也许SetupAPI知道。
答案 1 :(得分:0)
安德斯(Anders)提出了一个很好的建议-我不知道一种方法来判断该键是否存在于任何特定系统上的一个(或多个)键盘上。另外,一般不要忘记屏幕键盘和触摸设备。
为什么不简单地将函数绑定到两个键呢?您是否有充分的理由不这样做?
答案 2 :(得分:0)
为使Numpad Enter被识别为两种Enter类型,键盘硬件必须发送一个映射到the current keyboard layout中的VK_RETURN
的扫描代码。键盘布局由系统设置和接收键盘输入(或用户)的窗口(而不是物理键盘)确定。虚拟键盘布局很可能与物理键盘不匹配(即按键上的标签与其功能不匹配)。
有两种策略可以使不同的物理键盘布局正常运行:
Enter和Numpad Enter都映射到VK_RETURN
;没有为Numpad Enter保留虚拟按键代码,因此无法在不同的键盘布局上使用不同的扫描代码。使用策略1时,任何键都可以变成 Enter ,但不能专门变成 Numpad Enter。使用策略2时,Numpad Enter仍具有与通常相同的扫描代码。
在硬件级别,Enter发送0x1C
,而Numpad Enter发送0xE0 0x1C
(来源:我自己的观察和一个document by Andries Brouwer)。 Windows有不同的报告方式:WM_KEYDOWN
的{{1}}的第24位,low level keyboard hooks的lParam
标志,Raw Input的LLKHF_EXTENDED
标志,甚至更多。
简而言之,可以安全地假定Numpad Enter为0x1C加上扩展键标志,因为在任何其他情况下,都无法识别。
我知道我的键盘上是0x9C(156)
我假设您是从 DirectInput 接收到此值的,该值定义了一个值为0x9C的枚举常量RI_KEY_E0
。此值不是扫描代码。