其中涉及许多密切相关的概念,相关术语经常被滥用,甚至在官方文档中也是如此。
重要的窗户类型:
顶级窗口:没有父窗口的窗口。应用程序的主窗口几乎总是顶级窗口。它与 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。