在 Linux 上运行的简单 C 程序中,有没有办法在 while (1)
循环中捕获 KEY PRESSED 和 KEY RELEASED 事件从终端窗口。
kbhit()
将返回 true
,getch()
返回被按下的字符。
如何捕获 RELEASE 事件?
最佳答案
您不能以可移植的方式执行此操作。终端(以及类似 xterm 的模拟器)只为您提供按下的键,而不是释放事件。图形用户界面通常提供接收单独的新闻和发布事件的能力。
在图形环境中运行的终端仿真器将这些事件组合成单独的字符。在图形环境中读取时,这些是键符号,其中可能包含字符。除了按键事件本身的按下和释放事件之外,您还可以有 修饰符,例如 shift 修饰符、控制修饰符和元修饰符,它们是单独的事件。如果你运行 xev
,您可以看到这些单独的事件。
将这些事件组合成一个字符后,终端仿真器可能会将其作为一系列数据字节发送到您的应用程序,例如,以 UTF-8 编码。当您使用 getch()
,ncurses 库读取这些字节,并将它们再次组合成一个字符。在这两者(终端仿真器和应用程序)之间是伪终端和它的翻译,终端仿真器和应用程序都必须操作它们。
如果您不在图形环境中运行,除了图形应用程序(例如 xev
可以直接读取按键/释放之外,还有(并非总是)其他方式事件。 Linux 控制台支持这一点。例如,参见 Receiving key press and key release events in Linux terminal applications? 中引用的链接
关于keyboard - C 中的按键按下和按键释放中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33581030/