0

我想在我的程序中添加某些行为,将函数绑定到小键盘输入键(如果存在),或者绑定备用键(如果不存在)。

据微软称:

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

(资源)

我知道在我的键盘上它是 0x9C (156),但这不能保证适用于所有键盘。

我不能使用MapVirtualKey()andVK_RETURN因为MAPVK_VK_TO_VSC它总是返回键盘中心主返回键的扫描码。

我如何在没有用户干预的情况下获取这些信息?

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

4

3 回答 3

1

扫描码取决于硬件,在不同的系统上可能不一样。可以有多个扫描码映射到一个虚拟键。虚拟键应该是通用的并且不依赖于硬件。

您可以区分WM_KEYDOWNWM_KEYUP; WPARAM是,当使用小键盘上的键时,第VK_RETURN24 位被设置:LPARAMEnter

指示该键是否为扩展键,例如出现在增强的 101 或 102 键键盘上的右手 ALT 和 CTRL 键。如果是扩展键,则值为 1;否则为 0。

GetKeyboardType可以告诉您有关“键盘”的一些信息,但由于这些天可以连接多个键盘,您必须更深入地了解是否有任何键盘具有您正在寻找的属性。或许SetupAPI知道。

于 2018-07-04T14:20:38.003 回答
0

要使 Numpad Enter 被识别为任一类型的 Enter,键盘硬件必须发送映射到当前键盘布局VK_RETURN内的扫描代码。键盘布局由系统设置和接收键盘输入(或用户)的窗口决定,而不是由物理键盘决定。虚拟键盘布局很可能与物理键盘不匹配(即按键上的标签与其功能不匹配)。

有两种策略可以让不同的物理键盘布局正常工作:

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

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的枚举常量。此值不是扫描码。

于 2019-10-12T05:24:10.303 回答
0

Anders 提出了一个很好的观点——我不知道如何判断该键是否存在于任何特定系统上的(一个)键盘上。此外,不要忘记一般的屏幕键盘和触摸设备。

为什么不简单地将您的功能绑定到两个键呢?你有充分的理由这样做吗?

于 2018-07-05T08:08:40.273 回答