在Linux终端应用程序中接收按键按下和释放事件

25

我想编写一个简单的C程序,并根据“按键按下”和“按键释放”事件执行不同的操作。这个程序将从rxvt中运行。

我应该使用哪个库或机制来访问按键按下和松开?读取/dev/tty只提供按键释放,这是真的吗?termcapterminfoncursesS-Lang也是如此吗?有没有一种方法可以在终端应用程序中实现这一点?

3个回答

13
以下链接可能对您使用键盘原始模式有所帮助,这将使您访问键盘事件而不仅仅是按键释放。
  1. 这篇Linux Journal 文章
  2. SourceForge上的这篇文章
  3. 以及当出现问题时可以使用的这个HOWTO
但原始模式的缺点是需要从扫描码手动转换字符。

5
谢谢您的答案,我需要在终端程序中获得原始键盘访问权限,这是解决方案!但是需要记住,使用原始键盘访问权限,您的程序不会像传统的终端程序一样“表现”。例如,在远程机器上运行时,您无法注册键事件。请记住这一点。 - leemes
3
请注意,这些仅在您连接到实际控制台时才有效--如果您正在使用伪终端(例如终端窗口),它们将无效。 - Chris Dodd
所有三个链接仍然有效(甚至是1995年的Linux Journal),但也许可以更具有未来性? - Peter Mortensen
Linux Journal 的文章有些不清楚。 s+0x80 是加法吗?还是两个独立的字节?它不是从 PS/2 键盘发送的内容。例如,默认情况下(可能是扫描设置 2),按下键盘上的“F3”键会产生一个扫描码为 0x04。释放 F3 会导致发送两个(独立的)扫描码,即 0xF0 和 0x04,通过电线传输(0xF0 先被发送)。 - Peter Mortensen
这已经被观察到(使用逻辑分析仪和PulseView),无论是古老的PS/2键盘(例如BTC 5349(1983年))还是2021年的USB键盘(能够在PS/2模式下运行)。 - Peter Mortensen

9

在一般情况下,这是行不通的。 ANSI终端(所有仿真器都是从中派生出来的)仅表示按键“按下”事件。 它们不会独立记录上/下事件。

如果您需要低级键盘事件访问权限,则正确的环境确实是GUI程序。 即使是Web应用程序也比终端具有更清晰的键盘事件访问权限。


3

我认为ncurses不会起作用。Basilevs提供的链接谈到了“向上箭头”键和“向下箭头”键,而不是按下和释放键。


相关:为什么我需要50点声望才能评论?我可以做些什么代替吗? - Peter Mortensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接