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.
+1: zdecydowanie jest to lepsza trasa, szczególnie jeśli mamy do czynienia z dużą liczbą okien. –
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ę. –
@ Szekle Greg: Prawdopodobnie chcesz SWP_NOACTIVATE, a może SWP_ASYNCWINDOWPOS – Anders