Which windows appear in the Alt+Tab list? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20071008-00/?p=24863
Raymond Chen 2007年10月08日
有读者Phil Quirk询问,Alt+Tab切换列表中显示哪些窗口的规则是什么。 规则其实相当简单,尽管这不是你凭直觉就能猜到的。
注意:这个算法的细节是内部实现的一部分。 它随时都可能改变,所以请不要依赖于这些细节。 实际上,随着Flip和Flip3D的出现,这个规则已经发生了变化; 这里我们只讨论传统的Alt+Tab窗口。
对于每个可见窗口, 我们向上追溯其所有者链,直到找到根所有者。 然后我们向下追溯可见的最后一个活动弹出窗口链,直到找到一个可见窗口。 如果你回到了起始点,那么这个窗口就会被加入到Alt+Tab列表中。
用伪代码表示这个过程:
BOOL IsAltTabWindow(HWND hwnd)
{
// Start at the root owner
HWND hwndWalk = GetAncestor(hwnd, GA_ROOTOWNER);
// See if we are the last active visible popup
HWND hwndTry;
while ((hwndTry = GetLastActivePopup(hwndWalk)) != hwndTry) {
if (IsWindowVisible(hwndTry)) break;
hwndWalk = hwndTry;
}
return hwndWalk == hwnd;
}
这个算法的目的是为每个通过所有权关联的窗口群组分配一个最有代表性的窗口。 (注意,这个算法不考虑被拥有的窗口是模态的还是非模态的。)
至少在你不是在玩一些复杂的窗口样式游戏时,规则就是这么简单。 WS_EX_TOOLWINDOW
和WS_EX_APPWINDOW
这两个扩展样式是为了让人们能够操纵窗口是否出现在Alt+Tab列表中,即使按照简单规则它们本不应该出现。
这是Windows提供的一种“如果你认为你比Windows更聪明,那就来证明它”的选项。 我个人建议避免使用这些选项,因为它们会使你的窗口与系统中其他窗口的行为不一致。
具有WS_EX_TOOLWINDOW
扩展样式的窗口,即使它是可见的,也会被当作不可见处理。 具有WS_EX_APPWINDOW
扩展样式的窗口,即使它有所有者,也会被当作没有所有者处理。
一旦你开始使用这些扩展样式,你就进入了“试图绕过规则”的领域,结果通常是比没有使用它们时更加混乱。
我不确定最初的评论者到底想表达什么。 评论中描述的窗口层级结构(这更像是一个让我调试他们问题的要求,而不是一个建议)说窗口C同时是窗口A和B的模态窗口,这对我来说没有意义,因为一个窗口只能有一个所有者。
选择Alt+Tab代表窗口的算法可能不是完美的,但它是目前我们所拥有的。 我确信这个算法的细节会不时地进行调整。 不,让我更正一下。 我知道这个算法的细节会不时地进行调整。 操作的本质是保持不变的(显示用户可以切换到的窗口,使用每个窗口群组中最“自然”的候选窗口), 但随着“自然”概念的细化,具体细节可能会被微调。