Для этого я использовал WinApi функции (точнее обертки этих функций реализованные в Delphi);
Чтоб найти нам нужное окно в чате используем FindWindow для главного окна, и FindWindowEx для дочерних окон.
Структуру окон и то что нам надо искать можно посмотреть любым сканером окон (Мне например нравится InqSoft Window Scanner)
Потом нашей форме(Или любому другому контролу у которого Parent обязательно должно быть nil) в свойство ParentWindow присваиваем Хендл найденного окна;
Этого достаточно чтобы "прилипнуть" к нужному нам объекту.
Но на этом проблемы не заканчиваются например нам надо отслеживать когда канал закрывается, изменяет размер, прячется...
Далеко не все Api сообщения будут доходить до нашего окна. Поэтому я использовал хук для перехвата WinАpi сообщений.
Устанавливается нужный нам хук так:
Код: Выделить всё
HookHandle := SetWindowsHookEx(WH_CALLWNDPROC, @WndHook, 0, GetCurrentThreadId);
Где WndHook функция вида:
Код: Выделить всё
function WndHook(CODE, WParam, LParam: DWORD): DWORD; stdcall;
begin
...Наш код...
Result := CallNextHookEx(HookHandle, code, WParam, LParam);
end;
Функция CallNextHookEx - должна быть обязательно, она передает сообщение следующему хуку (если он есть), так как неизвестно сколько хуков наставленно.
Например переключатель раскладки клавиатуры в Windows использует хук на нажатия клавиш чтобы перехватывать нужные ему сочетания клавиш.
При дестрое обязательно снимаем хук - UnhookWindowsHookEx(HookHandle)
Ну и напоследок несколько функций которые могут пригодится для работы с чужими окнами:
Чтобы определить размер окна - GetWindowRect(ChannelWindow, Rect)
Чтобы передвинуть окно - MoveWindow(ChannelWindow, Left, Top, Width, Height, True)
Чтобы определить отображается ли окно - IsWindowVisible(ChannelWindow)