【问题标题】:How to determine if a certain key is pressed, knowing only its position on U.S. keyboards?如何确定某个键是否被按下,只知道它在美国键盘上的位置?
【发布时间】:2010-09-28 12:53:28
【问题描述】:

考虑到,对于 Windows 视频游戏,我需要确定在美式英语键盘布局上生成 ` 和 ~ 字符的键(通常在 Escape 键下方并留到 1)是否已被按下。这听起来像是一个微不足道的问题,但对我来说似乎不是一个问题。

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

我们目前的“解决方案”是使用LoadKeyboardLayoutMapVirtualKeyEx在美式英语键盘布局上找到生成`字符的键的OEM扫描码,然后只听那个OEM扫描码。问题是,如果用户没有安装美国英语布局,这将不起作用。

有没有真正的方法可以在 Windows 上做到这一点?

【问题讨论】:

    标签: windows keyboard


    【解决方案1】:

    OEM 扫描码不会因键盘而异。没有理由不使用它。

    在 DOS 时代,相同的扫描码已用于游戏,因为它是检测按键向上和按键向下事件的唯一方法。没有人对此有任何问题,我怀疑它将来会改变。

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

    【讨论】:

    • 谢谢。你有任何机会,你第一段中的陈述的来源吗?
    • 不幸的是,我没有任何来源,但扫描码映射自 IBM XT 以来没有改变(尽管它已针对 102 键键盘进行了扩展)。使用 USB 键盘,扫描代码无论如何都会在驱动程序中模拟。
    【解决方案2】:

    将游戏动作与角色联系起来,而不是钥匙的位置。否则,你如何告诉用户按下哪个键? “在转义键下”?他们可能在那里什么都没有,但如果你告诉他们“^ 键”,他们就可以找到它。

    您可能还希望使其可配置以适应异国情调的键盘布局和用户偏好。

    【讨论】:

    • 抱歉,我们需要根据它的位置使用键,而不是根据它生成的字符。原因是它相对于其他不依赖于布局的键的位置(例如数字键,但在我们的例子中是 F1..F12 键)。是的,文档只是说明“ESC 下的密钥”。
    猜你喜欢
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 2023-04-07
    • 1970-01-01
    • 2015-10-18
    • 2012-02-19
    相关资源
    最近更新 更多