BringWindowToTop,SetForegroundwindow,SetWindowPos等有什么区别?

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

他们之间真正的区别是什么? 何时以及为什么BringWindowToTop会优先于SetForegroundWindow ,或者SwitchToThisWindow ,甚至是SetWindowPos ,而标志设置为激活并显示?

Solutions Collecting From Web of "BringWindowToTop,SetForegroundwindow,SetWindowPos等有什么区别?"

涉及许多密切相关的概念,甚至在官方文件中也经常滥用相关术语。

Windows的重要类型:

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

  • 子窗口 :由父窗口包含的Windows。 他们的地位总是与父母的遗relative有关。 子窗口往往是“控制”:UI的东西,如按钮和编辑框。

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

  • 拥有的Windows :由另一个窗口控制的Windows,但不一定是另一个窗口的子项。 一个例子是一个浮动工具调色板:它被应用程序中的另一个窗口所拥有,但它并没有被锁定到另一个窗口的区域。

  • 所有者窗口 :Windows拥有一个拥有的窗口。

所有者/所有者关系与父母/子女关系之间的区别通常并不重要,因此父母和子女的条款通常用于两种情况,即使在文档中也是如此。 在一些情况下,父字段和参数被重载以表示父母和/或所有者。

重要概念:

  • z顺序的顶部 :这实际上意味着显示在其他窗口之上的窗口。

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

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

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

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

考虑到这些术语,你可以解析你列出的函数的MSDN描述,以找出细微差别。

如果你想要布置你的窗口的孩子,只需使用SetWindowPos(或MoveWindow,SizeWindow和ShowWinow)。 在其余的函数中,SwitchToThisWindow看起来不赞成,基本上和SetForegroundWindow一样。 (请注意,在许多情况下,SetForegroundWindow将不会做你想要的,除非你是活跃的应用程序,或者活动的应用程序已经授权你使用它。)BringWindowToTop主要是把窗口放到z-顺序(你可以用SetWindowPos来完成),如果你在顶层窗口调用它,会产生额外的副作用,使得它的行为像SetForegroundWindow。

更新: Raymond Chen 在活动窗口和前景窗口之间进行了更明确的区分 。 去引用:

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

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

使用showwindow只改变窗口的状态

使用bringwindowtotop通过孩子激活父窗口。 如果你发送一个子窗口(也许是一个浮动的工具栏),父母将被带到前面,并有焦点,而不是孩子。

他们都有自己的位置,显然有重复的功能,但每个都有所不同,取决于你想要做什么。