Сценарий - то, что у меня есть список дескрипторов окна к высокоуровневым окнам, и я хочу сместить их вокруг, таким образом, они расположены в 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);
Я уверен, что это - что-то маленькое/очевидное, которое я пропускаю здесь, но я просто не вижу его.
Существует специальный набор API для настройки положения окон для нескольких окон: BeginDeferWindowPos + DeferWindowPos + EndDeferWindowPos (SetWindowPos в цикле также будет работать конечно, но может быть больше мерцания)
Вы можете использовать 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);
}