代码之家  ›  专栏  ›  技术社区  ›  alvatar

控制台应用程序中的输入事件循环

  •  2
  • alvatar  · 技术社区  · 15 年前

    我正在尝试制作一个小的控制台应用程序,它能够将击键作为事件处理。我需要的主要是获得击键的能力,并且能够在不处理典型的stdin读取函数的情况下处理击键。

    我试着检查像mplayer这样的程序的代码,它们实现了这一点(例如,为了停止播放),但是我不能用这么大的代码库来了解这一点的核心。

    谢谢

    4 回复  |  直到 15 年前
        1
  •  4
  •   t0mm13b    15 年前

    你可以使用ncurses函数系列 getch '如链接所示,这里有另一个 link 这对你有帮助,顺便说一下,应该指出的是,ncurses是平台可移植的,所以如果你决定将目标重新定位到另一个平台,这是一个很大的优势,那么你应该很好地使用它……

        2
  •  2
  •   Ignacio Vazquez-Abrams    15 年前

    在上述应用程序的核心,您将发现 select(2) . 用它来对付stdin,看看什么时候可以从中读取输入。

        3
  •  2
  •   penguin4hire    15 年前

    查看您是否有权访问getch()函数。使用此函数可以检索单个击键,甚至(ctrl+(char))击键。在得到这些数据之后,我想应该由您来为这个事件创建一个处理程序。因此,您可以实现一个索引/函数ptr对表,使用击键作为索引,并为每个索引分配一个函数指针来处理该事件。希望这有帮助。

        4
  •  2
  •   JustJeff    15 年前

    要将stdin更改为在按下enter之前不缓冲,可以像这样修改终端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()来检查字符是否准备好读取。

    推荐文章