【问题标题】:Placing a window after TOPMOST window在 TOPMOST 窗口之后放置一个窗口
【发布时间】:2026-02-16 16:15:01
【问题描述】:

我有一个窗口,它是 TOPMOST,我还有另一个 (myWindow) 窗口,我想将它放在第一个窗口的后面,我不希望第二个窗口位于最上面:

SetWindowPos(topMostWin, HWND_TOPMOST, left, top, width, height, flags);
LONG_PTR exstyle = ::GetWindowLongPtr(myWindow, GWL_EXSTYLE);
if (exstyle & WS_EX_TOPMOST)
{
    exstyle &= ~WS_EX_TOPMOST;
    if( ! ::SetWindowLongPtr(myWindow, GWL_EXSTYLE, exstyle))
    {
        LOG_ERROR();
    }
}
SetWindowPos(myWindow, topMostWin, left, top, width, height, flags);

但是 myWindow 一直表现得像最顶层的窗口,当我检查 myWindow 的扩展样式的 WS_EX_TOPMOST 属性时,它仍然处于打开状态。即使我将窗口放在最上面的窗口之后,是否可以关闭最上面的位?

【问题讨论】:

    标签: c winapi windows-7 z-order window-position


    【解决方案1】:

    HWND_TOP 会将您的窗口置于 z 顺序的顶部,位于任何最顶层窗口之后。

    【讨论】:

    • 请你解释一下它是如何回答这个问题的?
    • @Sanich 你不明白什么?
    • 我不希望我的窗口位于任何最上面的窗口后面。我希望它位于特定的最顶层窗口之后,但本身不位于最顶层(WS_EX_TOPMOST 属性已关闭)
    • @sanich 你不能在一些最上面的窗口后面有一个窗口,但在其他窗口后面不能有一个窗口,除非那个窗口本身就是最上面的。
    • @Sanich,这里最好解释一下the old new thing blog
    【解决方案2】:

    由于引入了“最顶层”窗口,HWND_TOP 现在带来了 窗口“在 Z 顺序上尽可能高,而不违反 规则最顶层的窗口总是出现在非最顶层的窗口之上”。 这在实践中意味着什么?

    • 如果窗口位于最顶端,则 HWND_TOP 将其置于 Z 顺序的最顶端。
    • 如果一个窗口不是最顶层的,则 HWND_TOP 将它放在所有非顶层窗口的顶部(即,就在最低顶层窗口的下方, 如果有)。

    注意:以上讨论完全忽略了所有者和 拥有的窗户。我把它们排除在外是因为它们会添加一层 会分散主题的复杂性。

                                    *Raymond Chen - The Old New Thing* 
    

    link to Raymond's blog site

    还有什么要说的? ...

    【讨论】: