1

我现在想在 X11 中捕获全局鼠标点击事件

我试图安装一个 x11event 过滤器,但它不能在全局范围内工作。

class XApplication: public QApplication
{
  public:
    XApplication (int & argc, char **argv):
        QApplication (argc , argv)
    {
    }

protected:
    bool x11EventFilter (XEvent *e)
    {
        qDebug() << "X11 Event: " << e->type;
        return QApplication::x11EventFilter(e);
    }
};

更新

我的意思是在窗口之外,当我单击窗口时,上面的代码有效。

4

1 回答 1

3

您可以使用 QX11Info 类从 Qt 查询 X11 信息。请参阅其文档。然后您可以从中使用原始 Xlib。

您可以使用XGrabPointer(). 如果你使用它,其他应用程序在抓取指针时不会收到指针事件。man XGrabPointer会帮助你。

订阅事件的“正常”方式是XSelectInput()在窗口上使用,但问题是您必须在每个现有窗口上调用 XSelectInput。请参阅其手册页...

我知道 xxf86dga 扩展有一些与鼠标相关的调用,但我不确定它们是做什么的。

XQueryPointer()是另一种查询指针状态而不从其他窗口窃取事件的方法。

我能想到的唯一其他地方是 XInput 扩展,但我也不确定它是否会对您有所帮助。

xev有关处理 X11 事件的良好参考,请参阅源代码:http: //cgit.freedesktop.org/xorg/app/xev

使用 XGrabPointer 的示例代码:

#include <stdio.h>
#include <assert.h>
#include <X11/Xlib.h>

int main(void)
{
        Display *d;
        Window root;

        d = XOpenDisplay(NULL);
        assert(d);

        root = DefaultRootWindow(d);

        XGrabPointer(d, root, False, ButtonPressMask | ButtonReleaseMask |
                     PointerMotionMask, GrabModeAsync, GrabModeAsync, None,
                     None, CurrentTime);

        XEvent ev;
        while (1) {                     
                XNextEvent(d, &ev);  
                switch (ev.type) { 
                case ButtonPress:
                        printf("Button press event!\n");
                        break;
                case ButtonRelease:
                        printf("Button release event!\n");
                        break;
                case MotionNotify:
                        printf("Motion notify event!\n");
                        break;
                default:
                        printf("Unknown event...\n");
                } 
        } 

        XCloseDisplay(d);
        return 0;
}

编译使用:gcc x11mouse.c -o x11mouse -lX11

于 2012-04-12T14:53:58.347 回答