如何确定小键盘是否存在以及如何获取小键盘Enter键的扫描代码?

时间:2018-07-04 12:14:50

标签: windows winapi keyboard numpad scancodes

我想在我的程序中添加某些行为,将某个功能绑定到numpad Enter键(如果存在),或者将备用键绑定(如果不存在)。

根据Microsoft:

  

扫描代码是键盘硬件在以下情况下生成的值   用户按下一个键。它是一个与设备有关的值,用于标识   与该键所代表的字符相反,所按下的键。   应用程序通常会忽略扫描代码。相反,它使用   与设备无关的虚拟键代码来解释击键消息。

(source)

我知道在 my 键盘上它是0x9C(156),但这可以保证对所有键盘都适用。

我不能将MapVirtualKey()VK_RETURNMAPVK_VK_TO_VSC一起使用,因为它总是返回键盘中央的主返回键的扫描代码。

如何在无需用户干预的情况下获取此信息?

我的语言是C / C ++,仅适用于Win32。

3 个答案:

答案 0 :(得分:1)

扫描代码取决于硬件,在不同的系统上可能不同。可以有多个映射到虚拟密钥的扫描代码。虚拟密钥应该是通用的,并且与硬件无关。

您可以分辨出WM_KEYDOWNWM_KEYUP的区别;当使用数字键盘上的 Enter 键时,WPARAMVK_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的扫描代码。键盘布局由系统设置和接收键盘输入(或用户)的窗口(而不是物理键盘)确定。虚拟键盘布局很可能与物理键盘不匹配(即按键上的标签与其功能不匹配)。

有两种策略可以使不同的物理键盘布局正常运行:

  1. 更改键上可见的标签,但将扫描代码保持在相同的物理位置。为了使每个按键的功能与其标签相匹配,用户必须在软件中选择,安装或创建正确的键盘布局。
  2. 物理移动按键,或将预先建立的扫描代码分配给不同的物理位置。操作系统不知道或不在乎物理上的任何密钥。它只是根据当前的键盘布局将扫描代码映射为虚拟键代码。

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 hookslParam标志,Raw Input的LLKHF_EXTENDED标志,甚至更多。

简而言之,可以安全地假定Numpad Enter为0x1C加上扩展键标志,因为在任何其他情况下,都无法识别。

  

我知道我的键盘上是0x9C(156)

我假设您是从 DirectInput 接收到此值的,该值定义了一个值为0x9C的枚举常量RI_KEY_E0。此值不是扫描代码。