2010-07-19 3 views
7

시나리오는 최상위 창에 대한 창 핸들 목록이 있으며 선택 순서대로 정렬되도록 주위를 이동하려고합니다. 필자는 목록을 반복하여 (마지막으로 끝내고 자하는 창으로) 각각을 SetForegroundWindow으로 호출하기 시작했습니다. 이것은 시간의 일부가 작동하는 것처럼 보였지만 언제나 그런 것은 아니며, 각 호출 사이에서 약간 일시 중지했을 때 약간 향상되었습니다.Win32 API를 사용하여 많은 Windows의 Z- 순서 업데이트하기

더 좋은 방법이 있나요?


편집 :

그것은 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); 

내가 뭔가 작은 확신/분명 내가 여기 실종 해요하지만 난 그냥 보이지 않아요.

답변

11

여러 개의 창을위한 창 위치를 설정하기위한 API를의 특별한 세트가있다 : + EndDeferWindowPos BeginDeferWindowPos + DeferWindowPos (루프에서을 SetWindowPos도 물론 작동하지만 더 깜박임이있을 수 있습니다)

+0

+1 : 이것은 특히 더 많은 수의 창을 다루는 경우에 더 나은 경로입니다. –

+0

팁 주셔서 감사합니다, 이것은 올바른 접근 방식처럼 보입니다. 내가 겪고있는 문제에 대한 나의 편집을 보라. –

+1

@ 그렉 샤클 즈 : SWP_NOACTIVATE, 아마도 SWP_ASYNCWINDOWPOS를 원할 것입니다. – Anders

5

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

좋은 호출 , SetWindowPos에는 z 순서 매개 변수도 있음을 알지 못했습니다. 이 문제가 SetForegroundWindow에서 언급 한 것과 같은 타이밍 문제로 인해 어려움을 겪고 있는지 알고 계십니까? –

+0

'SetForegroundWindow()'보다 성능이 좋은지보십시오. –

+0

나는 그 계획을 세우고 있습니다. 나중에 결과를보고 할 것입니다. –

관련 문제