我对窗口可见性优先级系统感到好奇,该系统允许某些窗口位于其他窗口之上。例如:
当我们在 Chrome 中使用“画中画”模式时,我们可以强制将视频源覆盖在大多数其他程序窗口的顶部。
当我们使用脚本时,例如这个 AutoHotKey 脚本:
^SPACE:: Winset, Alwaysontop, , A
我们可以强制大多数程序窗口保持覆盖在大多数其他程序窗口之上。当程序设置为全屏模式(如游戏或媒体播放器)时,其窗口可见性将优先于大多数程序。
我有兴趣了解分配程序窗口可见性层次结构的系统,以及 Windows 如何管理这些层次结构。
例如,为什么 Chrome 中的“画中画”模式可以覆盖除全屏游戏之外的所有内容?我想也许所有全屏程序都优先,但是当 SMPlayer 处于全屏模式时,Chrome 中的“画中画”模式仍然优先。
所以我的问题是:什么系统用于确定窗口可见性的优先级,以及如何为每个程序及其不同模式分配层次结构?
答案1
使用什么系统来优先考虑窗口可见性
窗口具有 Z 顺序,该顺序在创建时设置:
窗口的 Z 顺序表示窗口在重叠窗口堆栈中的位置。此窗口堆栈沿虚拟轴(即 Z 轴)定向,从屏幕向外延伸。Z 顺序顶部的窗口与所有其他窗口重叠。Z 顺序底部的窗口与所有其他窗口重叠。
系统在一个列表中维护 z 顺序。系统会根据窗口是顶层窗口、顶级窗口还是子窗口,将窗口添加到 z 顺序中。顶层窗口会覆盖所有其他非顶层窗口,无论它是活动窗口还是前台窗口。顶层窗口具有样式
WS_EX_TOPMOST
。所有顶层窗口在 z 顺序中都出现在任何非顶层窗口之前。子窗口按 z 顺序与其父窗口分组。当应用程序创建窗口时,系统会将其置于同类型窗口的 Z 顺序的顶部。您可以使用 函数 将窗口置于同类型窗口的 Z 顺序的顶部。您可以使用和函数
BringWindowToTop
重新排列 Z 顺序。SetWindowPos
DeferWindowPos
用户通过激活不同的窗口来更改 z 顺序。系统将活动窗口定位在相同类型窗口的 z 顺序的顶部。当窗口到达 z 顺序的顶部时,其子窗口也会到达。您可以使用该
GetTopWindow
函数搜索父窗口的所有子窗口并返回 z 顺序最高的子窗口的句柄。该GetNextWindow
函数检索 z 顺序中下一个或上一个窗口的句柄。