Получить переднее окно CHILD

Всякий раз, когда Skype находится в представлении по умолчанию, TConversationWindow становятся дочерними элементами tSkMainForm окна.

У меня возникли проблемы с определением того, какой TConversationWindow активен, однако это не похоже на интерфейс MDI - виден только один TConversationWindow, как если бы это была вкладка/страница.

Когда я делаю GetForegroundWindow, возвращается дескриптор основной формы Skype (tSkMainForm). Есть ли способ получить передний план TConversationWindow в Skype?

Этот мой вопрос содержит скриншоты Skype Вид по умолчанию, если он вам нужен. :)

EDIT: вот скриншот иерархии Wspector:

введите здесь описание изображения

EDIT2: я пытался пройти через окна следующим образом:

procedure TForm1.Button1Click(Sender: TObject);
  function GetClassName(Handle: HWND): String;
  var
  Buffer: array[0..MAX_PATH] of Char;
  begin
  Windows.GetClassName(Handle, @Buffer, MAX_PATH);
  Result := String(Buffer);
  end;
Var
 Wnd: HWND;
 SkypeWnd: HWND;
begin
 SkypeWnd := FindWindow('tSkMainForm',nil);

 Wnd := GetTopWindow(SkypeWnd);

 while (GetClassName(Wnd) <> 'TConversationForm') and (Wnd <> 0) and (not IsWindowVisible(Wnd)) do
 begin
   Wnd := GetNextWindow(Wnd,GW_HWNDNEXT);
 end;

 Label1.Caption := GetClassName(Wnd)+' - '+GetHandleText(wnd);

end;

Вышеупомянутое должно найти видимое окно, однако, когда я его отлаживаю, оно никогда не входит в начало конца цикла «Пока», а Label1 отображает «TChromeMenu - ChromeToolbar». Когда я удаляю проверку IsWindowVisible, он по крайней мере находит TConversationForm. Что я делаю неправильно?

EDIT3: поместив проверки IsWindowVisible и getClassName внутри цикла и прервав их, когда они верны, мне удалось это сделать. :)


person Jeff    schedule 01.07.2011    source источник
comment
Как насчет EnumerateWindows или FindWindow, чтобы получить его?   -  person David Heffernan    schedule 01.07.2011
comment
Я думаю, вам нужно использовать z-порядок дочерних окон, чтобы определить, какое из них находится сверху.   -  person ain    schedule 01.07.2011
comment
Нет такой функции EnumerateWindows, FindWindow здесь тоже не применимо. Лучше всего GetWindow(.., GW_HWNDFIRST) колл.   -  person Premature Optimization    schedule 01.07.2011
comment
@David - FindWindow и FindWindowEx не возвращают ожидаемое TConversationWindow. Как EnumWindows поможет мне в этой ситуации? @ain - Как бы я это сделал? :)   -  person Jeff    schedule 01.07.2011
comment
@Downvoter - Первый параметр, это родительское окно?   -  person Jeff    schedule 01.07.2011
comment
@David - окно является дочерним элементом tSkMainForm   -  person Jeff    schedule 01.07.2011
comment
@David - пожалуйста, смотрите отредактированный пост, я добавил снимок экрана с Винспектором :)   -  person Jeff    schedule 01.07.2011
comment
@David Все равно, если вы хотите, чтобы это были дети, вызовите EnumChildWindows.ChildWindows - это отобразит список детей, но, насколько я знаю, он не даст мне активного?   -  person Jeff    schedule 01.07.2011
comment
Определите, что вы подразумеваете под активным.   -  person David Heffernan    schedule 01.07.2011
comment
@David - я имею в виду окно, которое я сейчас смотрю, потому что в представлении по умолчанию вы можете видеть только одно TConversationForm за раз. :)   -  person Jeff    schedule 01.07.2011
comment
@Jeff Джефф Это зависит от реализации Skype, но легко догадаться, как это будет сделано. Либо активный находится выше остальных в z-порядке. Или, что более вероятно, все неактивные окна беседы невидимы. Достаточно легко проверить, что это такое.   -  person David Heffernan    schedule 01.07.2011
comment
@ Дэвид - Так как мне сравнить? Получить следующее окно, пока я не найду то, что видно?   -  person Jeff    schedule 01.07.2011
comment
EnumChildWindows и остановитесь, когда у вас появится нужный класс, и он станет видимым. Может быть.   -  person David Heffernan    schedule 01.07.2011
comment
@DavidHeffernan, позвольте нам продолжить обсуждение в чате   -  person Jeff    schedule 01.07.2011
comment
@David - я отредактировал свой OP с некоторым кодом, который ведет себя странно.   -  person Jeff    schedule 01.07.2011


Ответы (1)


Поместив проверки IsWindowVisible и getClassName внутри цикла и прервав их при значении true, мне удалось это сделать. :)

person Jeff    schedule 18.09.2012