【问题标题】:Input event loop in a console application控制台应用程序中的输入事件循环
【发布时间】:2011-01-27 01:02:45
【问题描述】:

我正在尝试制作一个能够将击键作为事件处理的小控制台应用程序。我需要的主要是获得击键的能力,并且能够在不处理典型的标准输入读取功能的情况下对它们进行操作。

我试图检查 mplayer 等程序的代码,它实现了这个(例如停止播放),但我无法用这么大的代码库了解它的核心。

谢谢

【问题讨论】:

  • 一定要跨平台吗?
  • 那会很好 :) 但 linux 是主要平台

标签: c linux console console-application


【解决方案1】:

您可以使用链接中显示的 ncurses 系列函数 'getch',这是另一个对您有帮助的 link,顺便指出,ncurses 是平台可移植的,所以如果您决定重新定位到另一个平台,那么您应该可以接受它,这是一个很大的优势......

【讨论】:

    【解决方案2】:

    您会在上述应用程序的核心找到select(2)。只需将它用于标准输入,以了解何时可以从中读取输入。

    【讨论】:

    • 默认情况下,您只能在收到完整行后从 stdin 读取,因此此时 select 也会返回。您也需要禁用行缓冲。
    【解决方案3】:

    查看您是否可以访问 getch() 函数。使用此功能,您可以检索单个击键,甚至是 (CTRL+(char)) 击键。在您拥有这些数据后,我想您可以为该事件创建一个处理程序。所以你可以做的是实现一个索引/函数 ptr 对的表,使用击键作为索引,并为每个索引分配一个函数指针来处理该事件。希望这会有所帮助。

    【讨论】:

      【解决方案4】:

      要将标准输入更改为在输入之前不缓冲,您可以像这样搞乱终端 i/o 设置..

      struct termios oldopts;
      struct termios newopts;
      
      tcgetattr(fileno(stdin), &oldopts);
      newopts = oldopts;
      newopts.c_lflag &= (~ICANON & ~ECHO);
      tcsetattr(fileno(stdin), TCSANOW, &newopts);
      

      termios 结构以及 tcgetattr() 和 tcsetattr() 原型在 termios.h 文件中。
      然后你可以使用 select() 来检查一个字符是否可以被读取。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-23
        • 1970-01-01
        • 1970-01-01
        • 2012-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多