【问题标题】:What are the differences between BringWindowToTop, SetForegroundwindow, SetWindowPos etc.?BringWindowToTop、SetForegroundwindow、SetWindowPos 等有什么区别?
【发布时间】:2010-12-05 09:02:01
【问题描述】:

BringWindowToTopSetForegroundWindowSwitchToThisWindowSetWindowPosShowWindow 都被描述为显示和激活一个窗口。

它们之间的真正区别是什么? BringWindowToTop 何时以及为什么会优先于 SetForegroundWindowSwitchToThisWindow 甚至 SetWindowPos,并设置为激活和显示标志?

【问题讨论】:

    标签: windows winapi


    【解决方案1】:

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

    重要的窗户类型:

    • 顶级窗口:没有父窗口的窗口。应用程序的主窗口几乎总是顶级窗口。它与 z-order 没有任何关系。

    • 子窗口:父窗口包含的窗口。它们的位置总是相对于父窗口的区域。子窗口通常是“控件”:UI 之类的东西,例如按钮和编辑框。

    • 父窗口:具有子窗口的窗口。顶层窗口通常有子窗口。但请注意,子窗口也可能有子窗口,因此既是父窗口又是子窗口。

    • 拥有的窗口:由另一个窗口控制的窗口,但不一定是另一个窗口的子窗口。一个示例是浮动工具面板:它由应用程序中的另一个窗口拥有,但并未锁定到该其他窗口的区域。

    • 所有者窗口:拥有自有窗口的窗口。

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

    重要概念:

    • z 顺序的顶部:字面意思是显示在其他窗口之上的窗口。

    • 活动窗口:一个模糊的概念,但它通常表示用户认为是“当前”窗口的顶级窗口。活动窗口通常使用独特的边框绘制,并且其在任务栏上的图块被突出显示。在所有其他顶级窗口中,活动窗口通常位于或接近 z 顺序的顶部,并且它是具有键盘焦点的窗口的父级或所有者(可能是间接的)。

    • 键盘焦点:表示将接收键盘消息的窗口。从概念上讲,有一个带有键盘焦点的窗口。通常,具有焦点的窗口是活动窗口的子窗口(或孙子窗口等)。

    • 前景:活动窗口通常位于前景中。这个名字似乎暗示它位于 z-order 的顶部,但它实际上意味着创建窗口的线程获得了轻微的优先级提升。该活动窗口通常也是前景窗口。

    假设您打开了这个浏览器窗口,并且还运行了一个记事本实例。如果您单击记事本中的文档,则会出现一连串消息和状态更改。您实际上是在单击一个大编辑框,它是记事本顶级窗口的子窗口。该点击导致编辑框被激活,但子窗口不能真正成为“活动”窗口,因此它只是获取键盘焦点并将激活消息向上传递到其祖先,直到它到达顶级窗口。顶级窗口通过移动到 z 顺序的顶部、突出显示其边框等来“激活”。它也成为前景窗口,因此它的线程得到了一点提升,使 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。引用:

    前台窗口的概念是在输入不同步时引入的,以表达“真正的全局活动窗口”,而不是继续引用本地活动窗口的SetActiveWindow。

    【讨论】:

      【解决方案2】:

      如果您需要更改窗口的大小(不仅仅是其状态),请使用setwindowpos

      使用showwindow 只改变窗口的状态

      使用bringwindowtotop 通过子窗口激活父窗口。如果您向它发送一个子窗口(可能是一个浮动工具栏),则父窗口将被带到前面并拥有焦点而不是子窗口。

      它们都有自己的位置,并且显然具有重复的功能,但是根据您想要做什么,它们的作用会略有不同。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-01-29
        • 2015-11-05
        • 1970-01-01
        • 2012-05-22
        • 1970-01-01
        • 1970-01-01
        • 2021-02-16
        相关资源
        最近更新 更多