니스와 :
더 신뢰성이 필요하면
int GetZOrder(IntPtr hWnd)
{
var z = 0;
for (var h = hWnd; h != IntPtr.Zero; h = GetWindow(h, GW.HWNDPREV)) z++;
return z;
}
:에주의 섹션에 따르면
/// <summary>
/// Gets the z-order for one or more windows atomically with respect to each other. In Windows, smaller z-order is higher. If the window is not top level, the z order is returned as -1.
/// </summary>
int[] GetZOrder(params IntPtr[] hWnds)
{
var z = new int[hWnds.Length];
for (var i = 0; i < hWnds.Length; i++) z[i] = -1;
var index = 0;
var numRemaining = hWnds.Length;
EnumWindows((wnd, param) =>
{
var searchIndex = Array.IndexOf(hWnds, wnd);
if (searchIndex != -1)
{
z[searchIndex] = index;
numRemaining--;
if (numRemaining == 0) return false;
}
index++;
return true;
}, IntPtr.Zero);
return z;
}
(루프가 외부 변경에 대한 원 자성이 아니기 때문에 GetWindow
, EnumChildWindows
은 루프에서 GetWindow
을 호출하는 것보다 안전합니다. 부모가 null 호출 EnumChildWindows
에 대한 매개 변수 섹션에 따르면 EnumWindows
에 해당합니다.) 그리고 대신도 동시 변경에서 원자 및 안전하지 않을 것입니다 각 창에 대한 EnumWindows
에 대한 별도의 호출의
, 보내 각 창을 params 배열로 비교하여 z 순서를 모두 동시에 검색 할 수 있습니다.
"데스크톱"은 부모 창에 null을 지정하여 부모 창으로 사용할 수 있어야합니다. 따라서 바탕 화면에서 최상위 창을 쉽게 얻을 수 있습니다. –
이것은 신뢰할 수 없습니다. 'GetNextWindow'는 단지'GetWindow'를 호출합니다. [GetWindow' 참조] (https://msdn.microsoft.com/en-us/library/ms633515 (v = vs.85) .aspx) : "GetWindow를 호출하여이 작업을 수행하는 응용 프로그램이 잡힐 위험이 있습니다 무한 루프 또는 파괴 된 창 핸들을 참조하십시오 ._ – zett42