【问题标题】:Get foreground CHILD window获取前台 CHILD 窗口
【发布时间】:2011-07-01 12:26:34
【问题描述】:

只要 Skype 处于默认视图TConversationWindow 就会成为tSkMainForm 窗口的子级。

我在找出哪个TConversationWindow 处于活动状态时遇到问题 - 但它不像 MDI 界面 - 只有 一个 TConversationWindow 是可见的,就像它是一个选项卡/页面一样

当我执行GetForegroundWindow 时,将返回 Skype 的 MainForm 句柄 (tSkMainForm)。有什么方法可以让我在 Skype 中获得前台TConversationWindow

我的This question 有Skype 默认视图的截图,如果你需要的话。 :)

编辑:这是 Winspector Hierachy 的屏幕截图:

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;

上面应该找到可见窗口,但是当我调试它时,它永远不会在 While 循环中进入 Begin End,并且 Label1 显示“TChromeMenu - ChromeToolbar”。当我删除 IsWindowVisible 检查时,它至少会找到一个 TConversationForm。我做错了什么?

EDIT3:通过将 IsWindowVisible 和 getClassName 检查放在循环中,并在为真时中断,我设法做到了。 :)

【问题讨论】:

  • EnumerateWindows 或 FindWindow 怎么样?
  • 我认为您必须使用子窗口的 z 顺序来确定哪个在顶部。
  • 没有“EnumerateWindows”这样的功能,FindWindow在这里也不适用。最好的选择是GetWindow(.., GW_HWNDFIRST) 打电话。
  • @David - FindWindowFindWindowEx 不会返回预期的 TConversationWindow。在这种情况下,EnumWindows 将如何帮助我? @ain - 我该怎么做? :)
  • @Downvoter - 第一个参数,是父窗口吗?

标签: delphi skype foreground window-handles


【解决方案1】:

通过将 IsWindowVisible 和 getClassName 检查放在循环中,并在为真时中断,我设法做到了。 :)

【讨论】:

    猜你喜欢
    • 2011-12-02
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 2018-03-03
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    相关资源
    最近更新 更多