1

我正在将当前使用 DirectInput 的应用程序转换为使用 RawInput。(DirectInput 是一个很大程度上被弃用的 API。)

不幸的是,尽管 RawInput 是 DirectInput 的推荐继任者,但它似乎并没有以与 DirectInput 完全相同的方式提供键盘数据。

DirectInput 使用DIK_*常量(如DIK_ADIK_RETURN等)来定义键盘上的特定物理键。这些键在键盘硬件上是一致的,但不会因键盘布局而改变。(例如,DIK_Q指的是标准美国英语 QWERTY 键盘上 Q 键所在物理位置的任何键。)在我的情况下,这是所需的行为。

RawInput 的RAWKEYBOARD结构同时提供 aMakeCode和 a VKey。我不能使用VKey,因为它会根据键盘布局而变化。

但是与常数MakeCode不对应 1:1 。DIK_*特别是,它不区分左右 ctrl 和 alt 键,或者大多数数字键盘键与其他键。

所以我的问题是:是否可以使用RAWKEYBOARD结构的内容来计算等效DIK_*常数?假设这MakeCode是解决这个问题的一部分,我可以依靠在MakeCode键盘硬件上保持不变,就像DIK_*常数一样吗?

4

1 回答 1

1

我不是 100% 确定这在所有键盘硬件上都是可靠的,但似乎我可以使用MakeCodeFlags(特别是RI_KEY_E0RI_KEY_E1标志)字段RAWKEYBOARD来确定按下或释放的实际物理键,并将其映射到DIK_常量. 我使用此表来确定单个键的大部分制造/扫描代码,然后通过实验找出其余键的扫描/制造代码和标志。

我已经在四种不同的键盘上对此进行了测试,并且都产生了相同的制造代码/标志:2 个 USB 键盘、一个 PS/2 键盘和运行训练营的 Macbook 上的内置键盘。

我希望有一些记录在案的确认,我可以依靠 make 代码和标志在所有键盘上保持一致,但到目前为止这似乎工作正常。

更新:现在大约 5 年后,我的软件已经拥有数以万计的真实用户,我还没有收到任何关于不正确键映射的报告。在这一点上,我有 99.999% 的信心这种方法在所有键盘上都能始终如一地工作,但需要注意的是,我不能确定将来事情不会改变。

于 2016-05-12T17:25:09.053 回答