我目前正在尝试查找我的一个Windows是否位于鼠标光标下方。这不是在我创建窗口的过程中完成的,而是在另一个过程中完成的。
我目前正在做的是通过进程PID找到窗口(我确保我的程序正确设置了_NET_WM_PID
)。这基本上可以通过XQueryTree
和XGetWindowProperty
运行。这很好,不是问题。
问题是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
答案 0 :(得分:1)
可以是子窗口,也可以是窗口管理器添加到普通窗口的装饰。
顺便说一下,检测你的窗口是否在鼠标下的正常方法是捕获XEnterWindowEvent和XLeaveWindowEvent,但这通常在程序本身内完成,而不是在外部。