“监听”媒体按键事件

Posted

技术标签:

【中文标题】“监听”媒体按键事件【英文标题】:"Listening" for media key press events 【发布时间】:2013-08-19 17:25:55 【问题描述】:

我正在用 C++ 编写一个应用程序,它需要能够在 Linux 中侦听某些按键,即 Media Next、Media Previous 和 Media Play/Pause。

存在哪些 API 可以让我监听按键?我假设最终用户正在运行 X,但如果不是,是否有“保证™”方式来捕捉媒体按键?

我对编写 C++ 有点陌生,尤其是在它与 Linux 相关的方面,但我对 Linux 一点也不陌生(只是习惯于在裸机上生活)。

【问题讨论】:

【参考方案1】:

我不确定您可以在多大程度上使用Xlib event handlers 在 X 下全局执行此操作。 Sans X,我相信它需要一个内核空间组件,如果你真的很想这样做,那可能是最好的选择。

但是,这不是一个好主意。你没有说你要做什么,但我认为它可能属于以下两类之一:要么你想使用那些键来操作您的应用(案例 A),或者您希望您的应用监控使用这些密钥的另一个应用的使用情况(案例 B)。

案例 A 中,这不是一个好主意,因为将全局击键与操作相关联是窗口管理器/桌面环境的领域(关联应该是动态的,而不是硬编码的),并且当您决定制定自己的规则而忽略这一事实,用户和其他开发人员不太可能欣赏它。如果您希望您的应用程序响应全局按键,您可以创建客户端和服务器部分,以便客户端可以通过窗口管理器(由用户配置)绑定到按键,然后将消息传递到守护程序服务器。您不会无缘无故地尝试短路或绕过这些现有约定(例如,因为它表面上使您的任务更容易,或者因为您确实想对某些特定键进行硬编码)。您创建的应用程序可以由用户通过其窗口管理器绑定到任何键。

案例 B 中,您进入了更不友好的领域,因为您实际上要做的是创建一个keylogger。再说一次,如果你真的决心这样做,你可能想四处寻找一个键盘记录内核模块(很确定这就是它所需要的)来适应,记住很少有人会想要使用必须诉诸这样的(如果它只是为了你,那没关系,但它仍然可能是一个糟糕的设计课程)。最后,如果您这样做是因为您试图将一些外部功能引入到使用与使用各种媒体密钥相关联的东西中,请不要这样做,因为无论是什么东西,它可能无论如何都没有硬编码到这些键:它只是您的窗口管理器的默认设置。

【讨论】:

绝对是案例A,我正在编写一个需要捕获媒体按键的浏览器插件。有了各种各样的 WM(GNOME 3、GNOME 2、Gala、Unity、XFCE、awesome、Compiz 等等),我到底怎么可能做到这一点?是否有独立于实现的方式来做到这一点? 我的应用是一个基于浏览器的 NPAPI 插件,在播放这些键时会简单地发出 javascript 事件,具有明显的实际用途。是否有一个框架可以让我轻松地从 WM 中获取关键事件? @TKKocheran :我没有使用过 NPAPI,所以我无法帮助你;如果上下文仅适用于浏览器是前台应用程序时,请在 SO 上提出一个 NPAPI 问题——无论如何,该 API 必须可以跨操作系统移植,对吧? [或者:Linux 上的 netscape 使用 GTK,并且那里有事件处理程序]。但是,如果您要做的是在浏览器不是前台应用程序时使其可操作,我认为您的情况是一艘船,但稍微复杂一些:您可能需要将服务器线程化到插件中,以便它可以监听来自通过 WM 与键关联的客户端的调用。

以上是关于“监听”媒体按键事件的主要内容,如果未能解决你的问题,请参考以下文章

JavaFX实战:几种事件监听实现,键盘按键事件监听,鼠标滚轮事件监听,鼠标按键事件监听,鼠标移动事件监听

JavaFX实战:几种事件监听实现,键盘按键事件监听,鼠标滚轮事件监听,鼠标按键事件监听,鼠标移动事件监听

JavaFX实战:几种事件监听实现,键盘按键事件监听,鼠标滚轮事件监听,鼠标按键事件监听,鼠标移动事件监听

Android监听耳机按键事件

onBackPressed() 监听返回按键事件

如何捕获android系统按键事件