X11:XQueryPointer 给我模糊 Windows

X11: XQueryPointer gives me fuzzy Windows

我目前正在尝试查找我的 Windows 之一是否在鼠标光标下方。这不是在我创建 window 的过程中完成的,而是在另一个过程中完成的。

我目前正在做的是通过进程 PID 找到 Window(我确保我的程序正确设置了 _NET_WM_PID)。这基本上通过 XQueryTreeXGetWindowProperty 起作用。这工作正常,不是问题。

问题是 XQueryPointer 给我模糊的 Windows 回复。我写了一个简单的测试程序来说明我的意思。首先使用命令 xprop 通过 bash 从任何 Window 收集一个 ID。它会给你 Window ID。

然后 运行 我写的这个简单的测试程序(又快又脏),它每隔 0.5 秒就会给你鼠标光标下方 Window 的当前 ID:

#include <X11/Xlib.h>
#include <iostream>
#include <unistd.h>
#include <stdint.h>

int main()
{
    Display *display = XOpenDisplay(0);

    Window root = XDefaultRootWindow(display);
    Window root_return;
    Window child_return;
    int root_x_return;
    int root_y_return;
    int win_x_return;
    int win_y_return;
    uint32_t mask_return;

    while (true)
    {
        if (::XQueryPointer(display, root, &root_return, &child_return, &root_x_return, &root_y_return, &win_x_return, &win_y_return, &mask_return) == True)
        {
            std::cout << "Window ID: " << child_return << std::endl;
        }
        usleep(500000);
    }
    return 0;
}

谁能告诉我问题出在哪里?

这是我的示例输出: 我的程序找到 Window ID 73400324 xprop 找到 Window ID 73400324 测试程序找到Window ID 20996726

可能是childwindows,或者是window经理给普通window加的装饰。

顺便说一下,检测您的 window 是否在鼠标下方的正常方法是捕获 XEnterWindowEvent 和 XLeaveWindowEvent,但这通常是在程序本身内完成的,而不是在外部。