8

シナリオは、トップ レベル ウィンドウへのウィンドウ ハンドルのリストがあり、選択した z オーダーに配置されるようにそれらを移動したいというものです。リストを繰り返し (一番上に表示したいウィンドウを最後に)、SetForegroundWindowそれぞれを呼び出すことから始めました。これは時々うまくいくように見えましたが、常にではなく、各呼び出しの間に少し一時停止すると少し改善されました.

これを行うより良い方法はありますか?


編集:

BeginDeferWindowPos/ DeferWindowPos/EndDeferWindowPosルートが進むべき道のようです。ただし、一度に複数のウィンドウで動作させることはできないようです。ウィンドウ リストを 1 つのウィンドウに制限すると、正しく機能します。リストに複数のウィンドウがある場合、そのうちの 1 つだけを取得しているように見えます。これが私がやっていることの疑似コードです:

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 に答える