Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 如何确定某个键是否被按下,只知道它在美国键盘上的位置?_Windows_Keyboard - Fatal编程技术网

Windows 如何确定某个键是否被按下,只知道它在美国键盘上的位置?

Windows 如何确定某个键是否被按下,只知道它在美国键盘上的位置?,windows,keyboard,Windows,Keyboard,考虑一下,对于Windows视频游戏,我需要确定是否按下了在美国英语键盘布局上生成`和`字符的键(通常位于Escape键下方,左至1)。这听起来可能是一个微不足道的问题,但对我来说似乎不是 当Windows发送键盘消息时,它指定虚拟键代码和OEM扫描代码。我们不能依赖OEM扫描代码,因为“值取决于OEM”-我们也不能依赖虚拟键代码,因为它取决于当前活动的键盘布局 我们目前的“解决方案”是使用LoadKeyboardLayout和MapVirtualKeyEx查找在美国英语键盘布局上生成`字符'的

考虑一下,对于Windows视频游戏,我需要确定是否按下了在美国英语键盘布局上生成`和`字符的键(通常位于Escape键下方,左至1)。这听起来可能是一个微不足道的问题,但对我来说似乎不是

当Windows发送键盘消息时,它指定虚拟键代码和OEM扫描代码。我们不能依赖OEM扫描代码,因为“值取决于OEM”-我们也不能依赖虚拟键代码,因为它取决于当前活动的键盘布局

我们目前的“解决方案”是使用
LoadKeyboardLayout
MapVirtualKeyEx
查找在美国英语键盘布局上生成`字符'的按键的OEM扫描代码,然后只需聆听该OEM扫描代码。问题是,如果用户没有安装美国英语版式,则此功能不起作用


在Windows上有真正的方法做到这一点吗?

OEM扫描代码在不同的键盘之间不会改变。没有理由不使用它

在DOS时代,同样的扫描码也被用于游戏中,因为这是检测按键上升和按键下降事件的唯一方法。没有人对此有问题,我怀疑它将来会改变


如果您想要另一个选项,您可能需要尝试DirectInput API。它还提供了原始扫描码,如果我没弄错的话,您还可以查询每个键的物理位置、尺寸等等

将游戏动作绑定到角色,而不是键的位置。否则,如何告诉用户按哪个键?“在逃生钥匙下”?他们可能没有任何东西,但如果你告诉他们“钥匙”,他们可以找到它


您可能还希望对其进行配置,以适应奇特的键盘布局和用户偏好。

抱歉,但我们需要根据其位置而不是生成的字符来使用该键。这是因为它相对于其他不依赖布局的关键点(例如数字关键点,但在本例中是F1..F12关键点)的位置。是的,文档只是简单地声明“ESC下的键”。谢谢。你有没有第一段中的语句的源代码?不幸的是,我没有任何源代码,但扫描码映射自IBM XT以来没有改变(尽管它已扩展到102键键盘)。使用USB键盘,扫描代码无论如何都会在驱动程序中模拟。