keyboard - C 中的按键按下和按键释放中断

标签 keyboard c interrupt events

在 Linux 上运行的简单 C 程序中,有没有办法在 while (1) 循环中捕获 KEY PRESSEDKEY RELEASED 事件从终端窗口。

如果按键被按下,

kbhit() 将返回 truegetch() 返回被按下的字符。

如何捕获 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/

相关文章:

emacs - 避免出现 "Emacs Pinky"的最佳方法是什么?

android - AutoCompleteTextView:在后按时删除软键盘而不是建议

C String -- 按第一个单词长度排序

c - 如何让这个函数接受任意字符串?

java - registerNatives() 方法有什么作用?

在另一个中断 vector 中调用一个中断 vector

interrupt - Ada - pragma Attach_Handler() 是否可以将处理程序附加到 System.Priority'Last 优先级?

linux - 为什么来自中断处理程序的预定 tasklet 不运行

iphone ios 11 上的 Jquery mobile 在输入字段时重新定位

cocoa-touch - 如何知道键盘何时隐藏文本字段?