Обновление Z-порядка многих Windows с помощью Win32 API - PullRequest
7 голосов
/ 19 июля 2010

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

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

Ответы [ 2 ]

11 голосов
/ 19 июля 2010

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

5 голосов
/ 19 июля 2010

Вы можете использовать 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);
}
...