有没有办法让我的二进制文件对 Linux 中的一些全局热键做出反应?

Posted

技术标签:

【中文标题】有没有办法让我的二进制文件对 Linux 中的一些全局热键做出反应?【英文标题】:Is there a way for my binary to react to some global hotkeys in Linux? 【发布时间】:2010-09-09 15:23:57 【问题描述】:

是否可以监听某个热键(例如:Ctrl-I)然后执行特定操作?我的应用程序是用 C 编写的,只能在 Linux 上运行,并且没有 GUI。是否有任何库可以帮助完成此类任务?

编辑:例如,amarok 具有全局快捷键,例如,如果您将键组合映射到操作(比如说 Ctrl-+ Ctrl+)您可以在按键时执行该操作。如果我将 Ctrl-+ 映射到音量增加动作,则每次按 ctrl- +音量应该增加一定量。

谢谢

【问题讨论】:

【参考方案1】:

您的热键需要多全球化?对于 X 会话来说,它们是全球性的就足够了吗?在这种情况下,您应该能够打开 Xlib 连接并监听您需要的事件。

通常 X 中的键盘事件被传递到当前具有焦点的窗口,并向上传播直到它们被处理。显然这不是我们想要的。我们需要在任何其他窗口访问它之前处理该事件。我们需要在根窗口上调用XGrabKey,并使用热键的键码和修饰符来完成此操作。

我找到了一个很好的例子here。

【讨论】:

能详细一点吗?【参考方案2】:

我认为smoofra 在这里是正确的;您正在寻找使用 X 注册一个全局热键,以便您可以拦截按键并采取适当的措施。 Xlib 可能是你想要的,XGrabKey 是函数,我想。

恐怕不容易学;我确实找到了这个看起来很有用的例子:TinyWM。我还使用 Java/JNI 找到了example(访问相同的底层 Xlib 函数)。

【讨论】:

【参考方案3】:

你应该看看xbindkeys的源代码。

Xlib 编程相当晦涩难懂,文档很难找到,并且存在一些微妙的可移植性问题。你最好复制一些久经考验的代码。

【讨论】:

【参考方案4】:

一种方法是让您的应用程序在某个端口或套接字文件上侦听传入请求。

然后您可以编写一个小型客户端应用程序,连接到该端口或套接字文件并向正在运行的应用程序发送命令。

然后您可以配置您的窗口管理器以绑定某些组合键来启动您的小型客户端应用程序。

【讨论】:

我考虑过,但既然 amarok 和其他应用程序都能做到,我也一定有办法做到这一点。【参考方案5】:

在 UNIX 中,您可以通过 终端 访问命令行 shell。这可以追溯到人们通过直接连接到机器的终端(例如通过串行电缆)访问他们的大型共享计算机的日子。

事实上,“xterm”程序或您在 UNIX 机器上使用的任何衍生程序都被恰当地称为 终端仿真器 - 它的行为(从您的角度和操作的角度来看)系统)很像那些老式终端机之一。

这使得以有趣的方式处理输入变得有点复杂,因为有许多不同种类的终端,并且您的 UNIX 系统必须了解每种类型的功能。这些功能传统上存储在 termcap 文件中,我认为更现代的系统使用 terminfo 代替。试试

man 5 terminfo

在 Linux 系统上了解更多信息。

现在,好消息是,您无需对终端功能等做太多的麻烦,即可拥有一个命令行应用程序,它可以通过输入或窗口功能来做有趣的事情。有一个库,curses,会有所帮助。查找

man 3 ncurses

在您的 Linux 系统上了解更多信息。您可能会在网上找到一个不错的使用 curses 的教程。

【讨论】:

以上是关于有没有办法让我的二进制文件对 Linux 中的一些全局热键做出反应?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法让我的笔记本电脑上的这个运动检测系统播放 mp3 文件?

有没有办法让我的图像通过 MySQL 或 phpMyAdmin 显示在我的 PHP 页面上?

有没有办法在 Rust 库中包含二进制或文本文件?

有没有办法在后台让我的应用在 CMMotionActivity 更改时得到通知?

集装箱港口转发

将数据附加到 S3 对象