2016-07-22 36 views
1

目前我正在試圖找到,如果我的Windows的一個是鼠標光標下方。這不是在我創建窗口的過程中完成的,而是在另一個過程中完成的。X11:XQueryPointer讓我模糊的Windows

什麼我目前做的是通過查找該進程的PID窗口(我確信_NET_WM_PID是由我的程序設置是否正確)。這基本上通過XQueryTreeXGetWindowProperty工作。這工作正常,不是問題。

的問題是,XQueryPointer讓我模糊的Windows回來。我寫了一個簡單的測試程序來展示我的意思。首先使用命令xprop通過bash從任何你喜歡的窗口收集一個ID。它會給你窗口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

可能是子窗口,或者窗口管理器增加了裝飾一個普通的窗口。

順便說一句,檢測窗口是否在鼠標下的正常方法是捕獲XEnterWindowEvent和XLeaveWindowEvent,但這通常在程序本身內部完成,而不是在外部完成。

+0

因爲一些原因,我不能捕獲這些事件,我需要通過外部程序來做到這一點。我可以以某種方式檢測任何窗口ID的「主」窗口嗎?這將永遠是一個窗口,是根窗口的孩子嗎?在那種情況下,我可以到達我找到的XID的父窗口,直到我到達窗口上方的一個窗口。 – Nidhoegger

+0

是的,順序應該是RootWindow - > DecorationWindow - > AppWindow(其中DecorationWindow是由窗口管理器添加的)。 XQueryTree應該能夠告訴你更多... – JvO