Windows Bringwindowtop、SetForegroundwindow、SetWindowPos等之间有什么区别。?

Windows Bringwindowtop、SetForegroundwindow、SetWindowPos等之间有什么区别。?,windows,winapi,Windows,Winapi,、全部描述为显示和激活窗口 它们之间的真正区别是什么?如果需要更改窗口的大小(不仅仅是其状态),请使用SetWindowPos,切换到该窗口,甚至切换到设置了激活和显示标志的SetWindowPos,何时以及为什么会首选bringwindowtop 使用showwindow仅更改窗口的状态 使用bringwindowtop通过子窗口激活父窗口。如果你给它发送一个子窗口(可能是一个浮动工具栏),父窗口将被带到最前面,并具有焦点,而不是子窗口 它们都有自己的位置,显然有重复的功能,但每一个都会根据您

、全部描述为显示和激活窗口


它们之间的真正区别是什么?如果需要更改窗口的大小(不仅仅是其状态),请使用
SetWindowPos
切换到该窗口
,甚至切换到设置了激活和显示标志的
SetWindowPos
,何时以及为什么会首选
bringwindowtop

使用
showwindow
仅更改窗口的状态

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


它们都有自己的位置,显然有重复的功能,但每一个都会根据您想要做的事情而有所不同。

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

重要的窗口类型:

  • 顶级窗口:没有父窗口的窗口。应用程序的主窗口几乎总是顶级窗口。它与z顺序无关

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

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

  • 拥有的窗口:由另一个窗口控制的窗口,但不一定是另一个窗口的子窗口。例如,浮动工具选项板:它属于应用程序中的另一个窗口,但未锁定到另一个窗口的区域

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

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

重要概念:

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

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

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

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

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

记住这些术语,您可以解析所列函数的MSDN描述,以梳理出细微的差异

如果您试图布置窗口的子窗口,只需使用SetWindowPos(或MoveWindow、SizeWindow和ShowWinow)。在其余的函数中,SwitchToThisWindow看起来已弃用,基本上与SetForegroundWindow相同。(请注意,在许多情况下,除非您是活动应用程序或活动应用程序授予您使用它的权限,否则SetForeGroundIndow不会执行您想要的操作。)BringwindowTop主要是将窗口置于z顺序的顶部(您可以使用SetWindowPos执行此操作),如果您在顶级窗口中调用它,它会有额外的副作用,使其行为类似于SetForeGroundIndow

更新:Raymond Chen发布了一篇文章。引述:

前台窗口的概念是在输入被取消同步时引入的,以表示“真正的全局活动窗口”,而不是设置活动窗口,后者继续指本地活动窗口