【问题标题】:Get currently pressed key in C?获取C中当前按下的键?
【发布时间】:2015-03-31 14:40:24
【问题描述】:

我需要能够在不完全停止程序的情况下获得当前被按下的字符。理想情况下,我希望程序继续运行,在 while 循环的每次迭代后检查密钥。由于这个原因,getch() 是有问题的。我想在按下“q”键时跳出while循环,但要让while循环继续运行直到那时。我正在使用带有 gcc 作为编译器的 Linux。

【问题讨论】:

  • 一周前有一篇类似的帖子。试试if(kbhit())getch();。如果没有按下任何键,kbhit() 将返回 0。
  • @CoolGuy:但kbhit 不是标准的Linux 函数。

标签: c linux


【解决方案1】:

在实践中,您应该使用库,这取决于您是在编写终端应用程序还是 GUI 应用程序。

对于终端应用程序,请阅读TTY demystified 页面并使用ncursesreadline。请注意,在熟模式下(这是默认情况),tty 具有内核管理的行缓冲区,因此无法通过getc 获取单个字符。另请参阅termios(3)tty(4)tty_ioctl(4)(您可以忍受将tty 设置为原始模式的痛苦-例如http://shtrom.ssji.net/skb/getc.htmlsjr 的评论中建议的http://shtrom.ssji.net/skb/getc.html,但我建议使用库) .

对于在桌面上运行的图形应用程序使用一些工具包,例如GTKQt

顺便说一句,在这两种情况下,编程模型都不再兼容幼稚的getc 函数。

另请阅读Advanced Linux Programming 并注意Linux 有多个多路复用system calls(这些在syscalls(2) 中列出),特别是poll(2) - 这可能被ncursesreadlineQtGtk 库。

【讨论】:

  • 感谢您的帮助!我决定使用 termios 库来更改终端设置。效果很好!
  • 不要忘记在退出程序之前重置终端设置。但你真的应该使用ncursesreadline。如果您的程序过早终止,则您的终端处于错误状态。
  • 这是一个问题。我怎么能在 NCurses 中做同样的事情?
  • ncursesreadline 都有很好的文档和示例。
  • 好的,我会调查的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-12
  • 2010-11-09
  • 1970-01-01
  • 2012-09-23
  • 2012-11-30
相关资源
最近更新 更多