2010-07-19 22 views
7

Senaryo, üst düzey pencerelere pencere tutamaçlarımın bir listesini oluşturmam ve bunları değiştirmek için seçtiğim z düzeninde düzenlenmelerini istiyorum. Listeyi yinelemeye başladım (sonuncuya kadar sonlandırmak istediğim pencereyle), her birine SetForegroundWindow'u arıyorum. Bu, zamanın bir kısmı gibi görünüyordu, ama her aramayla, aramda biraz ara verdiğimde biraz iyileşiyordu.Win32 API Kullanarak Birçok Windows'un Z Sırasını Güncelleme

Bunu yapmanın daha iyi bir yolu var mı?


Düzenleme:

Bu BeginDeferWindowPos/ DeferWindowPos/ EndDeferWindowPos rota benziyor

gitmek yoludur. Ancak, bir seferde birden fazla pencere ile çalışmak için görünmüyor olabilir. Pencere listesini tek bir pencerede sınırladığımda, düzgün çalışıyor. Liste birden fazla pencereye sahip olduğunda, yalnızca bunlardan birini alır gibi görünüyor. İşte ne yapıyorum sözde kod şudur:

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

ben bir şey küçük eminim/bariz Burada eksik ama sadece bunu göremiyorum.

cevap

11

birden pencereler için pencere pozisyonlarını ayarlamak için API yılların özel bir set vardır: + EndDeferWindowPos BeginDeferWindowPos + DeferWindowPos (bir döngüde SetWindowPos da elbette çalışacak, ama daha titreşimi olabilir)

+0

+1: Özellikle çok sayıda pencereyle uğraşıyorsanız, bu kesinlikle daha iyi bir yoldur. –

+0

Bahşiş için teşekkürler, bu almak için doğru yaklaşım gibi görünüyor. İçinde bulunduğum sorun için sorduğum soruya bakın. –

+1

@Greg Pranga: Muhtemelen SWP_NOACTIVATE, ve belki de SWP_ASYNCWINDOWPOS – Anders

5

Üst düzey pencerelerinizi sipariş etmek için SetWindowPos kullanabilirsiniz.

// 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

İyi çağrı SetWindowPos'un ayrıca z-order için bir parametresi olduğunu fark etmemiştim. Bu SetForegroundWindow ile belirtilen aynı zamanlama sorunlardan muzdarip olup olmadığını biliyor musunuz? –

+0

Bunu deneyin ve 'SetForegroundWindow() ':-)' den daha iyi performans gösterip göstermediğini görün. –

+0

Bunu planlıyorum, daha sonraya kadar yapamam. Sonuçlar daha sonra geri rapor edecek :) –

İlgili konular