2015-05-10 5 views
0

В настоящее время я работаю с XLib, чтобы закодировать приложение, которое может отправлять события мыши и клавиатуры в определенное окно (не отображается).Xlib, C++ - Get Window Handle (SendEvent, ...)

Я смог отправить эти события в окно, используя «окно» -handle, полученное методом «XGetInputFocus()». К сожалению, мне нужно получить окно-дескриптор другого окна (а не целенаправленного) и отправить поддельные входные события в это окно. Поэтому я написал метод «enumerateWindows» для получения этого дескриптора.

Приходит проблема. Я могу найти несколько окон, которые называются одинаковыми. Как минимум 3 "затмения" окна в дереве. Почему это? Поскольку я не знал, какое «окно» выбрать, я просто сравнил их все с окном, которое я получил из метода «XGetInputFocus()». Не было сопоставления (при сравнении с объектом identity). Нигде в дереве. Почему это? Как еще я могу получить ту же ссылку на Window, которую я получаю из «XGetInputFocus()»?

Вот мой код и выход:

#define EMPTY_WINDOW NULL 

/* rootWindow: Window that is being looked from 
* toSearch : Window that I want to obtain 
*/ 
Window* enumerateWindows(Display *display, Window rootWindow, Window toSearch) 
{ 

Window parent; 
Window *children; 
unsigned int nNumChildren; 

char *name; 
// Compare Object identity !! 
if(&rootWindow == &toSearch){ 
    cout << "Found correct Window!!" << endl; 
    return &rootWindow; 
} 
// Descend tree.. 
int status = XQueryTree(display, rootWindow, &rootWindow, &parent, &children, &nNumChildren); 

if (status == 0) 
{ 
    cout << "Cant query further.." << endl; 
    return EMPTY_WINDOW; 
} 

if (nNumChildren == 0) 
{ 
    return EMPTY_WINDOW; 
} 

for (int i = 0; i < nNumChildren; i++) 
{ 
    Window *ret = enumerateWindows(display, children[i],toSearch); 
    if(ret != EMPTY_WINDOW){ 
     return ret; 
    } 
} 
XFree((char*) children); 
return EMPTY_WINDOW; 
} 
int main() 
{ 
// Obtain the X11 display. 
    Display *display = XOpenDisplay(0); 

    if(display == NULL) return -1; 

// Get the root window for the current display. 
    Window winRoot = XDefaultRootWindow(display); 

// Find the window which has the current keyboard focus. 
    Window winFocus; 
    int revert; 

    // The important part: Obtain Current focus window! 
    XGetInputFocus(display, &winFocus, &revert); 
    // Try to obtain the same window from the QueryTree 
    Window *win = enumerateWindows(display, winRoot, winFocus); 

    if(win == &winFocus){ 
     cout << "Object Identity same! Problem solved!" << endl; 
    }else{ 
     cout << "Didn't find the correct object.." << endl; 
    } 

    XCloseDisplay(display); 
    return 0; 
} 

Я ценю вашу помощь! Заранее спасибо!

С уважением

+0

Может кто-нибудь мне помочь? – Overholt

ответ

0

Хорошо, я нашел ответ. Этот код работает:

Window *getWindowList(Display *disp, unsigned long *len) { 
    Atom prop = XInternAtom(disp,"_NET_CLIENT_LIST",False), type; 
    int form; 
    unsigned long remain; 
    unsigned char *list; 

    if (XGetWindowProperty(disp,XDefaultRootWindow(disp),prop,0,1024,False,33, 
       &type,&form,len,&remain,&list) != Success) { // XA_WINDOW 
     return 0; 
    } 

    return (Window*)list; 
} 
char *getWindowName(Display *disp, Window win) { 
    Atom prop = XInternAtom(disp,"WM_NAME",False), type; 
    int form; 
    unsigned long remain, len; 
    unsigned char *list; 


    if (XGetWindowProperty(disp,win,prop,0,1024,False,AnyPropertyType, 
       &type,&form,&len,&remain,&list) != Success) { // XA_STRING 

     return NULL; 
    } 

    return (char*)list; 
} 
int main(){ 
    int i; 
    unsigned long len; 
    XKeyEvent esend; 
    Display *disp = XOpenDisplay(NULL); 
    Window *list; 
    char *name; 

     list = (Window*)getWindowList(disp,&len); 
    for (i=0;i<(int)len;i++) { 
     name = getWindowName(disp,list[i]); 
     cout << i << ": " << name << endl; 
     free(name); 
     } 
} 

XLib Window Name Problems

Смежные вопросы