8

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

有一个更好的方法吗?


编辑:

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

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);

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

4

2 回答 2

12

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

于 2010-07-19T18:33:38.133 回答
5

您可以使用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);
}
于 2010-07-19T15:23:12.670 回答