【问题标题】:Updating the Z-Order of Many Windows Using Win32 API使用 Win32 API 更新许多 Windows 的 Z 顺序
【发布时间】:2011-03-17 23:24:41
【问题描述】:

场景是我有一个顶级窗口的窗口句柄列表,我想移动它们,以便它们按照我选择的 z 顺序排列。我从迭代列表开始(我想最后一个窗口结束),在每个列表上调用SetForegroundWindow。这似乎在某些时候有效,但并非总是如此,当我在每次通话之间稍作停顿时会有所改善。

有没有更好的方法来做到这一点?


编辑:

看起来BeginDeferWindowPos/DeferWindowPos/EndDeferWindowPos 路线是要走的路。但是,我似乎无法一次使用多个窗口。当我将窗口列表限制为单个窗口时,它可以正常工作。当列表有多个窗口时,它似乎只得到其中一个。这是我正在做的伪代码:

HWND[] windows;
HWND lastWindowHandle = 0;
HDWP positionStructure = BeginDeferWindowPos(windows.length);

for (int i = 0; i < windows.length; i++)
{
    positionStructure = DeferWindowPos(positionStructure, windows[i], 
        lastWindowHandle, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
}

EndDeferWindowPos(positionStructure);

我确定这是我在这里遗漏的一些小东西/很明显,但我只是没有看到它。

【问题讨论】:

    标签: windows winapi z-order


    【解决方案1】:

    有一组特殊的 api 用于为多个窗口设置窗口位置:BeginDeferWindowPos + DeferWindowPos + EndDeferWindowPos(循环中的 SetWindowPos 当然也可以,但它可能会有更多的闪烁)

    【讨论】:

    • +1:这绝对是更好的方法,尤其是在处理大量窗口时。
    • 感谢您的提示,这似乎是正确的方法。查看我对问题的编辑,了解我遇到的问题。
    • @Greg Shackles:你可能想要 SWP_NOACTIVATE,也可能想要 SWP_ASYNCWINDOWPOS
    【解决方案2】:

    您可以使用SetWindowPos 订购您的顶级窗口。

    // Hypothetical function to get an array of handles to top-level windows
    // sorted with the window that's supposed to be topmost at the end of array.
    HWND* windows = GetTopLevelWindowsInOrder();
    int numWindows = GetTopLevelWindowCount();
    
    for(int i = 0; i < numWindows; ++i)
    {
        ::SetWindowPos(windows[i], HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
    }
    

    【讨论】:

    • 好电话,我没有注意到 SetWindowPos 也有一个 z-order 参数。你知道这是否会遇到我提到的 SetForegroundWindow 相同的时间问题吗?
    • 试试看它是否比SetForegroundWindow()表现更好:-)
    • 我已经计划好了,只是以后不能这样做。稍后将报告结果:)
    • SetForegoundWindow 不仅仅是改变 Z 顺序。它“激活”窗口,这对诸如焦点之类的事情有影响,这需要消息在系统中飞来飞去,这可能就是为什么时间看起来很关键的原因。按照 In Silico 的建议使用 SetWindowPos,至少对于前 n-1 个窗口。根据您要实现的目标,您可能希望在最后一个窗口上执行SetWindowPos
    猜你喜欢
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 2012-08-02
    相关资源
    最近更新 更多