【问题标题】:<Shift>+<Right> vs. <Right>?<Shift>+<Right> 与 <Right>?
【发布时间】:2014-01-01 08:56:09
【问题描述】:

我想知道最终用户按下了什么,所以我使用了getch()

如果用户按下 Right,我可以得到0xE0 0x4D

如果用户按下 Ctrl+Right,我可以得到0xE0 0x47

如果用户按下Shift+Right,我可以得到0xE0 0x4D

Rightgetch()Shift+Right 的返回是一样的,我怎么知道最终用户有什么按下了吗?

【问题讨论】:

  • 据我了解,getch() 不处理 shift 或 ctrl 键。
  • @remyabel 那么,如何解决我的问题?
  • 这必须是终端应用吗?你可以制作一个 GUI 应用程序,然后大多数框架/库都有办法做到这一点

标签: c getch


【解决方案1】:

根据您报告的按键值,我假设您正在使用一些 MS-DOS 环境和编译器,并且您已将键盘输入设置为扫描码模式。如果是这样,您应该了解所有驱动程序逻辑详细信息。特别是,按住 Shift 会报告相应的扫描码。 This table 报告两个班次有 2Ah 和 36h,因此,您应该将两者都考虑在内,保留一个按下修饰符的内部表格,以及两个 Ctrl、两个 Alt、Caps 等。

(这真的是你想要的吗?扫描码是非常低级的野兽。)

更新:我忘记指定导航键处理是特定于键盘本身的。对于数字块,它取决于 NumLock 状态。对于附加的箭头/导航块,它通常用作关闭 NumLock 的数字块,但存在细微差别。有很好的详细描述,如this one,请注意反映例如集 1 和翻译集 2 之间的区别(后者是当前与 PS/2 一起使用的)。 BIOS 中 USB 键盘的 PS/2 仿真可以添加自己的细节。一般来说,这一切并不复杂,但很麻烦,并且需要许多遗留问题知识。

【讨论】:

    【解决方案2】:

    简单的 getch 无法处理所有键盘事件。它不会按照你想要的方式工作。

    【讨论】:

    • 你有什么操作系统?
    猜你喜欢
    • 2022-12-01
    • 1970-01-01
    • 2020-07-20
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    • 2014-01-18
    • 1970-01-01
    相关资源
    最近更新 更多