【问题标题】:Console Keyboard hit detection and interpretting控制台键盘敲击检测和解释
【发布时间】:2011-08-16 16:19:31
【问题描述】:

嘿,我建议我应该使用 kdhit() 函数来检测控制台窗口中的按键:

"如果是 Windows,kbhit() 函数就是你想要的。如果是 *nix,这里有一个 kbhit() 模拟器。kbhit() 立即返回(不阻塞)并带有一个标志,表明存在或存在不是等待读取的键盘字符。您可以测试标志以查看是否应该发出键盘读取。"

但是我想知道读取密钥缓冲区或他所说的标志的最简单、希望是标准的方法。有小费吗? 谢谢!

【问题讨论】:

  • 没有标准的方法可以用键盘做任何事情(您只能从 STDIN 读取字节作为流上下文)。你将不得不坚持特定平台的东西。
  • C++ 标准委员会尚未同意计算机通常具有键盘。诚然,有些人没有。因此,标准库不支持任何像“按键被击中”功能这样的花哨的东西。您必须使用非标准支持功能,在大多数实际 CRT 实现中都可用。就像 _kbhit()。检查你的文档。

标签: c++ keyboard console keypress


【解决方案1】:

没有标准的方法可以做到这一点,因为如前所述,不能保证您的应用程序在一台甚至有键盘设备的机器上运行,以及即使在有键盘设备的情况下如何执行这样的用户界面功能键盘因平台而异。

在这一点上,无论谁告诉你kbhit() 是一个 Windows 函数,都是在误导你。 kbhit(), getch() and their relatives are actually part of the (C language bindings to the) MS-DOS API. 它们出现在 OS/2、Win32 和其他 C/C++ 编译器的运行时库中只是为了为 MS/PC/DR-DOS 程序提供移植帮助。该库将它们映射到任何存在的用于访问键盘的 native 机制(如果有的话),并且通常仅以正确的方式让 TUI(而不是 GUI)应用程序访问键盘。

如果您正在编写新的 TUI 应用程序,请不要使用 MS-DOS API。为您的目标平台使用适当的本机 API,例如 Win32 Console APIOS/2 Console APIPOSIX General Terminal Interface(通过 ncurses 或类似的方式)。

【讨论】:

    【解决方案2】:

    GetAsyncKeyState 非常有用

    检查一下 http://msdn.microsoft.com/en-us/library/ms646293%28v=vs.85%29.aspx

    【讨论】:

      【解决方案3】:

      使用 _kbhit() 测试是否按下了某个键。当它使用 _getch() 来获取值时。 (注意 _getch() 可以为特殊键返回 0 或 0xE0 并为该值再次调用 _getch()) 在阅读使用 _getche() 时显示字符。

      【讨论】:

        猜你喜欢
        • 2021-11-08
        • 2015-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多