2010-07-19 19 views
7

Scenariusz jest taki, że mam listę uchwytów okien do okien najwyższego poziomu i chcę je przesuwać, aby były uporządkowane w kolejności od zera. Zacząłem od iteracji listy (z oknem, które chcę zakończyć na ostatnim końcu), wywołując na każdym z nich SetForegroundWindow. Wydawało się, że działa to przez jakiś czas, ale nie zawsze, poprawiając trochę, gdy zatrzymałem się nieznacznie pomiędzy każdą rozmową.Aktualizowanie porządku Z w wielu systemach Windows przy użyciu interfejsu Win32 API

Czy jest lepszy sposób to zrobić?


Edit:

Wygląda na trasie BeginDeferWindowPos/DeferWindowPos/EndDeferWindowPos jest droga. Jednak nie mogę sprawić, żeby działało z więcej niż jednym oknem naraz. Kiedy ograniczam listę okien do jednego okna, działa poprawnie. Kiedy lista ma wiele okien, wydaje się, że tylko jeden z nich. Oto pseudokod, co robię:

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

Jestem pewien, że to coś małego/oczywiste jestem brakujące tutaj, ale ja po prostu nie widząc go.

Odpowiedz

11

Istnieje specjalny zestaw API do ustawiania położenia okien dla wielu okien: BeginDeferWindowPos + DeferWindowPos + EndDeferWindowPos (SetWindowPos w pętli będzie również działać oczywiście, ale może mieć więcej migotanie)

+0

+1: zdecydowanie jest to lepsza trasa, szczególnie jeśli mamy do czynienia z dużą liczbą okien. –

+0

Dzięki za podpowiedź, wydaje się to właściwym podejściem do podjęcia. Zobacz moją edycję pytania dotyczącego problemu, z którym się z nim kontaktuję. –

+1

@ Szekle Greg: Prawdopodobnie chcesz SWP_NOACTIVATE, a może SWP_ASYNCWINDOWPOS – Anders

5

Możesz użyć SetWindowPos, aby zamówić okna najwyższego poziomu.

// 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); 
} 
+0

Dobre połączenia , Nie zauważyłem, że SetWindowPos miał również parametr dla porządku z-z. Czy wiesz, czy będzie to miało te same problemy z timingiem, o których wspomniałem w SetForegroundWindow? –

+0

Wypróbuj i zobacz, czy działa lepiej niż 'SetForegroundWindow()' :-) –

+0

Planuję to, po prostu nie mogę tego zrobić do później. Poinformuję później o wynikach :) –