Windows 如何确定某个键是否被按下,只知道它在美国键盘上的位置?
考虑一下,对于Windows视频游戏,我需要确定是否按下了在美国英语键盘布局上生成`和`字符的键(通常位于Escape键下方,左至1)。这听起来可能是一个微不足道的问题,但对我来说似乎不是 当Windows发送键盘消息时,它指定虚拟键代码和OEM扫描代码。我们不能依赖OEM扫描代码,因为“值取决于OEM”-我们也不能依赖虚拟键代码,因为它取决于当前活动的键盘布局 我们目前的“解决方案”是使用Windows 如何确定某个键是否被按下,只知道它在美国键盘上的位置?,windows,keyboard,Windows,Keyboard,考虑一下,对于Windows视频游戏,我需要确定是否按下了在美国英语键盘布局上生成`和`字符的键(通常位于Escape键下方,左至1)。这听起来可能是一个微不足道的问题,但对我来说似乎不是 当Windows发送键盘消息时,它指定虚拟键代码和OEM扫描代码。我们不能依赖OEM扫描代码,因为“值取决于OEM”-我们也不能依赖虚拟键代码,因为它取决于当前活动的键盘布局 我们目前的“解决方案”是使用LoadKeyboardLayout和MapVirtualKeyEx查找在美国英语键盘布局上生成`字符'的
LoadKeyboardLayout
和MapVirtualKeyEx
查找在美国英语键盘布局上生成`字符'的按键的OEM扫描代码,然后只需聆听该OEM扫描代码。问题是,如果用户没有安装美国英语版式,则此功能不起作用
在Windows上有真正的方法做到这一点吗?OEM扫描代码在不同的键盘之间不会改变。没有理由不使用它 在DOS时代,同样的扫描码也被用于游戏中,因为这是检测按键上升和按键下降事件的唯一方法。没有人对此有问题,我怀疑它将来会改变
如果您想要另一个选项,您可能需要尝试DirectInput API。它还提供了原始扫描码,如果我没弄错的话,您还可以查询每个键的物理位置、尺寸等等 将游戏动作绑定到角色,而不是键的位置。否则,如何告诉用户按哪个键?“在逃生钥匙下”?他们可能没有任何东西,但如果你告诉他们“钥匙”,他们可以找到它
您可能还希望对其进行配置,以适应奇特的键盘布局和用户偏好。抱歉,但我们需要根据其位置而不是生成的字符来使用该键。这是因为它相对于其他不依赖布局的关键点(例如数字关键点,但在本例中是F1..F12关键点)的位置。是的,文档只是简单地声明“ESC下的键”。谢谢。你有没有第一段中的语句的源代码?不幸的是,我没有任何源代码,但扫描码映射自IBM XT以来没有改变(尽管它已扩展到102键键盘)。使用USB键盘,扫描代码无论如何都会在驱动程序中模拟。