linux 使用X11监听根窗口事件

ny6fqffe  于 12个月前  发布在  Linux
关注(0)|答案(1)|浏览(201)

我一直在尝试实现这一点,但我不能。XNextEvent从未被调用。我使用Ubuntu 22.04。这是我到目前为止的代码。我想打印点击和鼠标移动。我已经尝试使用XAllowEvents,XGrabPointer它不会工作。为什么?

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

char *key_name[] = {
    "first",
    "second (or middle)",
    "third",
    "fourth",  // :D
    "fivth"    // :|
};

int main(int argc, char **argv)
{
    Display *display;
    XEvent xevent;
    Window window;

    if( (display = XOpenDisplay(NULL)) == NULL )
        return -1;

    window = DefaultRootWindow(display);
    XAllowEvents(display, AsyncBoth, CurrentTime);

    XGrabPointer(display, 
                 window,
                 1, 
                 PointerMotionMask | ButtonPressMask | ButtonReleaseMask , 
                 GrabModeAsync,
                 GrabModeAsync, 
                 None,
                 None,
                 CurrentTime);

    while(1) {
        XNextEvent(display, &xevent);

        switch (xevent.type) {
            case MotionNotify:
                printf("Mouse move      : [%d, %d]\n", xevent.xmotion.x_root, xevent.xmotion.y_root);
                break;
            case ButtonPress:
                printf("Button pressed  : %s\n", key_name[xevent.xbutton.button - 1]);
                break;
            case ButtonRelease:
                printf("Button released : %s\n", key_name[xevent.xbutton.button - 1]);
                break;
        }
    }

    return 0;
}

字符串

knsnq2tg

knsnq2tg1#

XSelectInput是您的朋友。
有两种方法可以选择要报告给客户端应用程序的事件。一种方法是在调用XSetWindow和XChangeWindowAttributes时设置XSetWindowAttributes结构的event_mask成员。另一种方法是使用XSelectInput。
您要查找的获取窗口信息的函数是XQueryTree或XQueryPointer。另请参阅完整列表:获取窗口信息。

相关问题