X11:XQueryPointer给了我模糊的Windows

时间:2016-07-22 13:55:22

标签: c++ linux x11

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

我目前正在做的是通过进程PID找到窗口(我确保我的程序正确设置了_NET_WM_PID)。这基本上可以通过XQueryTreeXGetWindowProperty运行。这很好,不是问题。

问题是XQueryPointer给了我模糊的Windows。我写了一个简单的测试程序来表明我的意思。首先使用命令xprop通过bash从您喜欢的任何窗口收集ID。它会为您提供Window ID。

然后运行我编写的这个简单的测试程序(快速和脏),它为每个0,5s提供鼠标光标下方窗口的当前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;
}

有人可以告诉我这是什么问题吗?

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

1 个答案:

答案 0 :(得分:1)

可以是子窗口,也可以是窗口管理器添加到普通窗口的装饰。

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