gpt4 book ai didi

windows - BringWindowToTop、SetForegroundwindow、SetWindowPos 等有什么区别?

转载 作者:可可西里 更新时间:2023-11-01 12:07:09 24 4
gpt4 key购买 nike

BringWindowToTop , SetForegroundWindow , SwitchToThisWindow , SetWindowPos , ShowWindow 所有这些都被描述为显示和激活一个窗口。

它们之间的真正区别是什么?何时以及为何会 BringWindowToTop首选SetForegroundWindow , 或 SwitchToThisWindow甚至 SetWindowPos标志设置为激活和显示?

最佳答案

涉及到许多密切相关的概念,相关术语经常被滥用,即使在官方文档中也是如此。

重要的 window 类型:

  • 顶级窗口 : 没有父窗口的窗口。应用程序的主窗口几乎总是顶级窗口。它与 z-order 没有任何关系。
  • 子窗口 : 父窗口包含的窗口。它们的位置总是相对于父窗口的区域。子窗口通常是“控件”:诸如按钮和编辑框之类的 UI 东西。
  • 父窗口 : 有子窗口的窗口。顶层窗口通常有子级。但请注意,子窗口也可能有子窗口,因此既是父窗口又是子窗口。
  • 自有 window : 由另一个窗口控制的窗口,但不一定是另一个窗口的子窗口。一个例子是 float 工具选项板:它由应用程序中的另一个窗口拥有,但它没有锁定到另一个窗口的区域。
  • 业主 window :拥有自有窗口的 Windows。

  • 通常所有者/拥有关系和父/子关系之间的区别并不重要,因此父和子术语通常用于这两种上下文,即使在文档中也是如此。在某些情况下,父字段和参数被重载以表示父和/或所有者。

    重要概念:
  • z 顺序的顶部 : 这字面意思是显示在其他窗口之上的窗口。
  • 事件窗口 :一个模糊的概念,但它通常意味着用户会认为是“当前”窗口的顶级窗口。事件窗口通常用独特的边框绘制,并突出显示其在任务栏上的图块。在所有其他顶级窗口中,事件窗口通常位于或接近 z 顺序的顶部,并且它是具有键盘焦点的窗口的父级或所有者(可能是间接的)。
  • 键盘焦点 :表示将接收键盘消息的窗口。从概念上讲,只有一个具有键盘焦点的窗口。通常具有焦点的窗口是事件窗口的子窗口(或孙窗口等)。
  • 前景 :事件窗口通常位于前台。这个名字似乎暗示它位于 z 顺序的顶部,但它实际上意味着创建窗口的线程获得了轻微的优先级提升。该事件窗口通常也是前景窗口。

  • 因此,假设您打开了这个浏览器窗口,并且还运行了一个记事本实例。如果您在记事本中单击文档,则会发生一连串的消息和状态更改。您实际上是在单击一个大编辑框,它是记事本顶级窗口的子窗口。单击会导致编辑框被激活,但子窗口不能真正成为“事件”窗口,因此它只需要键盘焦点并将激活消息向上传递到其祖先,直到它到达顶级窗口。顶层窗口通过移动到 z-order 的顶部、突出显示其边框等来“激活”。它也成为前景窗口,因此它的线程得到了一点提升,使 UI 比任何其他窗口更具响应性视窗。

    考虑到这些术语,您可以解析您列出的函数的 MSDN 描述以梳理出细微的差异。

    如果您尝试布置窗口的子项,只需使用 SetWindowPos(或 MoveWindow、SizeWindow 和 ShowWinow)。在其余函数中,SwitchToThisWindow 看起来已被弃用,并且与 SetForegroundWindow 基本相同。 (请注意,在许多情况下,除非您是事件应用程序或事件应用程序已授予您使用它的权限,否则 SetForegroundWindow 不会执行您想要的操作。)BringWindowToTop 主要是将窗口带到 z- 的顶部顺序(您可以使用 SetWindowPos 执行),如果您在顶级窗口上调用它,则具有额外的副作用,使其表现得像 SetForegroundWindow。

    更新: Raymond Chen 发布了 clearer distinction between the active window and the foreground window .报价:

    The concept of the foreground window was introduced when input was desynchronized in order to express the "really global active window", as opposed to Set­Active­Window, which continued to refer to the local active window.

    关于windows - BringWindowToTop、SetForegroundwindow、SetWindowPos 等有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1544179/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com