在Linux中,我的二进制文件是否有一种方式可以对全局热键做出反应?

4
有没有可能监听某个热键(例如:Ctrl-I),然后执行特定的操作?我的应用程序是用C编写的,只能在Linux上运行,并且没有GUI。是否有任何库可以帮助完成这种任务?
编辑:以amarok为例,它具有全局快捷键,因此如果您将一组键映射到一个操作(例如Ctrl-+Ctrl+),则按下这些键时可以执行该操作。如果我将Ctrl-+映射到增加音量的操作,则每次按下ctrl-+时,音量都应该增加一定量。
谢谢
5个回答

5
你的快捷键需要多全局化?仅在X会话中全局化是否足够?如果是这样,您应该能够打开一个Xlib连接并侦听所需的事件。
通常,在X中,键盘事件被传递到当前具有焦点的窗口,并向上层次结构传播,直到它们被处理。显然,这不是我们想要的。我们需要在任何其他窗口可以访问它之前处理该事件。为此,我们需要在根窗口上使用热键的keycode和修饰符调用XGrabKey
我在这里找到了一个很好的例子。

请您能详细说明一下吗? - Vhaerun

3
我认为smoofra说得对;你想要在X中注册全局热键,以便拦截按键并采取适当的操作。Xlib可能是你想要的,而XGrabKey则是函数,我认为。

很难学习,恐怕;我找到了这个似乎有用的例子:TinyWM。我还发现了一个使用Java/JNI(访问相同底层Xlib函数)的示例


2
你应该查看xbindkeys的源代码。
Xlib编程相当晦涩,文档很难找到,而且存在微妙的可移植性问题。最好复制一些经过实战考验的代码。

1
一个做法是让你的应用程序监听特定的端口或套接字文件,以等待传入的请求。
然后你可以编写一个小型客户端应用来连接到该端口或套接字文件,并向运行中的应用程序发送命令。
接着你可以配置你的窗口管理器,将某些键组合绑定到启动你的小型客户端应用程序。

我考虑过这个问题,但既然Amarok和其他应用程序都能够做到,那么我也一定有办法做到。 - Vhaerun

0
在UNIX中,您通过终端访问命令行shell。这可以追溯到人们通过直接连接到计算机的终端(例如串行电缆)访问其大型共享计算机的日子。
实际上,在您的UNIX系统上使用的“xterm”程序或任何衍生程序都应该被称为终端仿真器 - 它的行为(从您和操作系统的角度)非常像那些老式终端机之一。
这使得以有趣的方式处理输入略微复杂,因为有许多不同类型的终端,您的UNIX系统必须了解每种终端的功能。这些功能传统上存储在termcap文件中,我认为更现代的系统使用terminfo。
man 5 terminfo

关于更多信息,请在Linux系统上查看。

现在,好消息是你不需要太多地去处理终端功能等等,就可以拥有一个命令行应用程序,它可以使用输入或窗口特性进行有趣的操作。有一个库叫做curses,可以帮助你。请查找。

man 3 ncurses

有关更多信息,请在您的Linux系统上查找。您可能会在网上找到一个不错的使用curses的教程。


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