Обновление Z-порядка многих Windows Using Win32 API

Сценарий - то, что у меня есть список дескрипторов окна к высокоуровневым окнам, и я хочу сместить их вокруг, таким образом, они расположены в 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);

Я уверен, что это - что-то маленькое/очевидное, которое я пропускаю здесь, но я просто не вижу его.

7
задан Barn Monkey 13 March 2013 в 17:56
поделиться

2 ответа

Существует специальный набор API для настройки положения окон для нескольких окон: BeginDeferWindowPos + DeferWindowPos + EndDeferWindowPos (SetWindowPos в цикле также будет работать конечно, но может быть больше мерцания)

11
ответ дан 6 December 2019 в 12:46
поделиться

Вы можете использовать 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);
}
5
ответ дан 6 December 2019 в 12:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: