Рассказываю, как это можно сделать под Линукс описанным мною выше способом, ибо под Винду щас ничего не пишу.
Часть 1.
1. Запускаешь ту программу, в окно которой тебе надо послать сообщение.
2. Смотришь название окна.
Часть вторая.
Существует несколько спецификация для оконных менеджеров. Некоторые оконные менеджеры могут вообще ее не поддерживать. Однако, исторически склалось, что в Линуксе окно имеет несколько атрибутов. Один из аттрибутов - это как раз то самое название окна, которое ты видишь на экране в полосочке наверху.
Читаем XLIB Reference Manual и видим, что за получение значения этого аттрибута отвечает функция
Status XFetchName(Display *display, Window w, char **window_name_return).
Первый параметр - это структура дисплея, которую ты можешь получить через qt_xdisplay() (Qt 3 series).
Второй параметр - это идентификатор окна, у которого надо подсмотреть название.
В третий параметр возвращается само название. Только фигня в том, что эта строка может быть в разных форматах.
Так, например, если название только из латинских букв, то это будет обычный string, если там есть национальные буквы, то это будет скорее всего COMPOUD_STRING, если не ошибся с написанием типа.
Часть 3.
Как я уже говорил про спецификации для оконных менеджеров, их много. Но есть одна спецификация, которой стараются придерживаться KDE и Gnome, - это icccm. Причем есть несколько версий, на данный момент последняя 2 с хвостиком.
Также на сайте KDE можно найти спецификацию для их оконного менеджера, в которой уже есть новый атрибут у окна, содержащий его название, причем в UNICODE, что несколько облегчает жизнь. Причем, там же упоминается, что, если этот новый атрибут окна существует, то надо использовать именно его. Я считываю его таким образом:
int iCount = 0;
Atom atom_NET_WM_NAME = XInternAtom(qt_xdisplay(), "_NET_WM_NAME", false);
Atom* pAtoms = XListProperties(qt_xdisplay(), wID, &iCount);
bool bExist = false;
for (int iIndex = 0; iIndex < iCount; ++iIndex)
{
if (pAtoms[iIndex] == atom_NET_WM_NAME)
{
bExist = true;
break;
}
}
if (bExist)
{
std::vector<unsigned char> propertyValue = charProperty(atom_NET_WM_NAME, wID);
return toTypeUTF8_STRING(propertyValue);
} else
{
QString strWM_NAME;
char *cName;
Status retCode = XFetchName(qt_xdisplay(), wID, &cName);
strWM_NAME = cName;
if (0 != retCode) XFree(cName);
return strWM_NAME;
}
Часть 4.
Тебе надо перебрать все открытые окна, на премет нахождения того, которое тебе надо. Я в своей недоделанной проге делаю так:
Window* lstChldWindow; //Массив дочерних окон корневого окна
unsigned int iCountChildWindow; //Количество элементов в массиве
//Получаю массив дочерних окон корневого окна
Status iResult = XQueryTree(qt_xdisplay(), static_cast<Window>(wID), &rootWindow, &parentWindow, &lstChldWindow, &iCountChildWindow);
Далее, для каждого окна из этого массива можно опять получить список дочерних окон, и так рекурсивно просмотреть все видимые окна, пока не найдешь то, которое тебе надо по названию.
Узнать, видимое окно, или нет, можно из результатов выполнения функции:
XWindowAttributes attrWnd;
XGetWindowAttributes(qt_xdisplay(), wID, &attrWnd);
Здесь все просто:
Первый параметр - указатель на структуру дисплея.
Второй - идентификатор окна,
Третий - указатель на структуру аттрибутов окна.
Ремарка. Сорри, возможно я тебя запутал. На самом деле, имя окна и другая инфа - это свойства окна, а вот аттрибуты - это было только что выше.Часть 5.
Тут ты уже имеешь идентификатор окна, которое тебе надо. Осталось послать ему событие. Для этого Xlib тоже имеет необходимые функции:
XSendEvent(Display* display, Window w, Bool propagate, long event_mask, XEvent* event_send);
typedef struct {
int type;
unsigned long serial;
Bool send_event;
Display *display;
Window window;
Atom message_type;
int format;
union {
char b[20];
short s[10];
long l[5];
} data;
} XClientMessageEvent;
Часть заключительная.
В итоге, то самое стороннее окно получит событие от сервера X, как если бы это событие породил пользователь. Вот и все. Тебе осталось почитать маны по Xlib, и у тебя все получится.
Чтобы это сделать для Винды, попроси еще кого-нибудь. Но алгоритм все равно тот же: найти окно, послать ему сообщение средствами платформы (в данном случае Винды).
P.S. Орфографию не проверяю, т.к. уже уходить надо. Удачи.