В настоящее время я работаю с 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;
}
Я ценю вашу помощь! Заранее спасибо!
С уважением
Может кто-нибудь мне помочь? – Overholt