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

C 在linux中从整个屏幕检测鼠标事件,c,linux,gtk,C,Linux,Gtk,在linux中是否可以从整个屏幕检测鼠标事件?我的应用程序是用C编写的,使用gtk2。我试着查找几个程序的源代码,但我所发现的只是抓取了整个屏幕,其他程序不再接收这些事件,这不是我要查找的 目前,我只是想直接读取设备,但这似乎不是一个很好的方法。。我想获取任何由键盘、脚本等生成的鼠标点击事件。如果您需要专门了解鼠标事件,除非您抓住指针,否则没有办法做到这一点 如果您只想检测用户是否空闲,有一种方法可以使用X屏幕保护程序扩展来实现 XScreenSaverInfo screen_saver_inf

在linux中是否可以从整个屏幕检测鼠标事件?我的应用程序是用C编写的,使用gtk2。我试着查找几个程序的源代码,但我所发现的只是抓取了整个屏幕,其他程序不再接收这些事件,这不是我要查找的


目前,我只是想直接读取设备,但这似乎不是一个很好的方法。。我想获取任何由键盘、脚本等生成的鼠标点击事件。

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

如果您只想检测用户是否空闲,有一种方法可以使用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”有一点更详细。

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

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

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


因此,确实没有一个好的解决方案,但也许其中一个坏的解决方案可以在您需要的情况下工作,以有限的方式应用,或者使用大量的免责声明。

也许您想编写类似于窗口管理器的代码?那么???为什么你想让tp捕捉所有鼠标事件???我需要根据用户活动做一些事情(我只需要点击事件,不需要坐标)。该程序是为有限的用户群(一个小型在线游戏社区)量身定做的,很难为外人描述它在做什么。一个窗口管理器有点过分了。第一种方法实际上可以工作,因为实际上不需要同时使用许多其他程序,那些需要的程序我可以测试它们是否会崩溃。但是,我们已经决定切换到java。这是一个小项目,我们现在是独立于平台的,因为有一个适用于java的mousehook库,它似乎在许多平台上都能很好地工作: