在linux中从整个屏幕检测鼠标事件

时间:2012-03-06 19:58:00

标签: c linux gtk

是否有可能在linux中从整个屏幕检测鼠标事件?我的应用程序是用C编程的,并使用gtk2。我试图查看几个程序的来源,但我发现只是抓住整个屏幕而其他程序不再接收这些事件,这不是我正在寻找的。

目前我只是想直接读取设备,但这似乎不是很好的方式..我想通过键盘,脚本等进行任何鼠标点击事件。

2 个答案:

答案 0 :(得分:1)

如果您需要专门了解鼠标事件,除非您抓住指针,否则确实没有办法做到这一点。

如果您只想检测用户是否空闲,可以使用X屏幕保护程序扩展程序来实现此目的。

XScreenSaverInfo screen_saver_info = { 0, };

XScreenSaverQueryInfo(xdisplay,
                      xroot,
                      &screen_saver_info);

if (screen_saver_info.idle > your_idle_threshold)
      // screen is idle.    

请注意,您必须在打开显示时启动扩展程序,

int event_base, error_base;
XScreenSaverQueryExtension(xdisplay, &event_base, &error_base)

" man XScreenSaverQueryInfo"有一点细节。

答案 1 :(得分:1)

我在某些地方看到的“解决方案”是在X窗口的整个树中的每个窗口上选择ButtonPressEvent,使用XSelectInput,并选择SubstructureNotifyMask来查找新窗口。已知此方法会破坏某些程序(通过防止鼠标事件从其客户端未选择ButtonPressEvent的窗口传播),因此使用它需要您自担风险。此外,如果另一个客户端有一个指针抓取它将无法工作。

您可以永久地使用GrabModeSync维护指针抓取,并允许鼠标​​事件转到通常通过调用XAllowEvents(event_mode = ReplayPointer)获取它们的窗口。如果你一直抓住一个完整的指针,那么它将可怕地打破你所有的程序,因为他们希望能够抓住指针。您可以使用XGrabButton获取单个按钮+修改器组合,但我怀疑您的窗口管理器可能会在实践中干扰此操作(这可能是修改窗口管理器以通知您事件或直接执行您需要的任何操作的好参数)

如果您使用的所有程序都支持AT-SPI(它们可能没有)并且您启用了辅助技术,则可以从AT-SPI获得鼠标事件的通知。这不会破坏任何东西,但它对某些程序不起作用。

所以确实没有一个好的解决方案,但是这些破解的解决方案中的一个可能会在您需要的情况下运行,以有限的方式应用或使用巨大的免责声明。