如何将 RawInput RAWKEYBOARD 结构转换为 DirectInput DIK_ 常量?
How do I convert a RawInput RAWKEYBOARD structure to a DirectInput DIK_ constant?
我正在将当前使用 DirectInput 的应用程序转换为使用 RawInput。 (DirectInput 在很大程度上已被弃用 API。)
不幸的是,尽管 RawInput 是 DirectInput 的推荐继任者,但它提供键盘数据的方式似乎与 DirectInput 不同。
DirectInput 使用 DIK_*
常量(例如 DIK_A
、DIK_RETURN
等)来定义键盘上的特定物理键。这些键在键盘硬件上是一致的,但不会根据键盘布局改变。 (例如,DIK_Q
指的是 Q 键在标准美式英语 QWERTY 键盘上的物理位置中的任何键。)在我的例子中,这是所需的行为。
RawInput 的 RAWKEYBOARD
结构同时提供 MakeCode
和 VKey
。我不能使用 VKey
,因为它会根据键盘布局而变化。
但是 MakeCode
不对应 1:1 与 DIK_*
常量。特别是,它不区分左右 ctrl 和 alt 键,或者大多数数字键盘键与其他键。
所以我的问题是:是否可以使用 RAWKEYBOARD
结构的内容来计算出等效的 DIK_*
常量?并假设 MakeCode
是解决这个问题的一部分,我可以依赖 MakeCode
在键盘硬件上保持不变,就像 DIK_*
常量一样吗?
我不是 100% 确定这在所有键盘硬件上都是可靠的,但看来我可以使用 MakeCode
和 Flags
(特别是 RI_KEY_E0
和 RI_KEY_E1
flags) RAWKEYBOARD
的字段来确定按下或释放的实际物理键,并将其映射到 DIK_
常量。我使用 this table 来确定每个键的大部分 make/scan 代码,然后通过实验找出其余键的 scan/make 代码和标志。
我已经在四种不同的键盘上进行了测试,并且都产生了相同的制造代码/标记:2 个 USB 键盘、一个 PS/2 键盘和 Macbook 运行 bootcamp 上的内置键盘.
我希望有一些文件证明我可以依赖所有键盘上一致的生成代码和标志,但到目前为止这似乎工作正常。
更新: 现在大约 5 年过去了,我的软件已经拥有数以万计的真实用户,而且我还没有收到过任何关于键映射不正确的报告。在这一点上,我有 99.999% 的信心这种方法在所有键盘上都能一致地工作,但需要注意的是,我不能确定未来事情不会改变。
我正在将当前使用 DirectInput 的应用程序转换为使用 RawInput。 (DirectInput 在很大程度上已被弃用 API。)
不幸的是,尽管 RawInput 是 DirectInput 的推荐继任者,但它提供键盘数据的方式似乎与 DirectInput 不同。
DirectInput 使用 DIK_*
常量(例如 DIK_A
、DIK_RETURN
等)来定义键盘上的特定物理键。这些键在键盘硬件上是一致的,但不会根据键盘布局改变。 (例如,DIK_Q
指的是 Q 键在标准美式英语 QWERTY 键盘上的物理位置中的任何键。)在我的例子中,这是所需的行为。
RawInput 的 RAWKEYBOARD
结构同时提供 MakeCode
和 VKey
。我不能使用 VKey
,因为它会根据键盘布局而变化。
但是 MakeCode
不对应 1:1 与 DIK_*
常量。特别是,它不区分左右 ctrl 和 alt 键,或者大多数数字键盘键与其他键。
所以我的问题是:是否可以使用 RAWKEYBOARD
结构的内容来计算出等效的 DIK_*
常量?并假设 MakeCode
是解决这个问题的一部分,我可以依赖 MakeCode
在键盘硬件上保持不变,就像 DIK_*
常量一样吗?
我不是 100% 确定这在所有键盘硬件上都是可靠的,但看来我可以使用 MakeCode
和 Flags
(特别是 RI_KEY_E0
和 RI_KEY_E1
flags) RAWKEYBOARD
的字段来确定按下或释放的实际物理键,并将其映射到 DIK_
常量。我使用 this table 来确定每个键的大部分 make/scan 代码,然后通过实验找出其余键的 scan/make 代码和标志。
我已经在四种不同的键盘上进行了测试,并且都产生了相同的制造代码/标记:2 个 USB 键盘、一个 PS/2 键盘和 Macbook 运行 bootcamp 上的内置键盘.
我希望有一些文件证明我可以依赖所有键盘上一致的生成代码和标志,但到目前为止这似乎工作正常。
更新: 现在大约 5 年过去了,我的软件已经拥有数以万计的真实用户,而且我还没有收到过任何关于键映射不正确的报告。在这一点上,我有 99.999% 的信心这种方法在所有键盘上都能一致地工作,但需要注意的是,我不能确定未来事情不会改变。