Nizza und lapidar:
int GetZOrder(IntPtr hWnd)
{
var z = 0;
for (var h = hWnd; h != IntPtr.Zero; h = GetWindow(h, GW.HWNDPREV)) z++;
return z;
}
Wenn Sie mehr Zuverlässigkeit benötigen:
/// <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;
}
(entsprechend dem Abschnitt Bemerkungen zu GetWindow
, EnumChildWindows
ist sicherer als Aufruf GetWindow
in einer Schleife, weil Ihre GetWindow
Schleife nicht atomare Änderungen von außen ist. für EnumChildWindows
auf den Abschnitt Parameter entsprechend, mit einer Null-Mutter Aufruf entspricht EnumWindows
.)
Dann anstelle einen separaten Aufruf an EnumWindows
für jedes Fenster, die auch atomare und sicher werden nicht von gleichzeitigen Änderungen würden, Sie senden jedes Fenster, das Sie in einem Parameter-Array vergleichen möchten, damit alle z-Befehle gleichzeitig abgerufen werden können.
Und der "Desktop" sollte in der Lage sein, als das übergeordnete Fenster verwendet werden, indem Sie null für das übergeordnete Element angeben. Daher können Sie das oberste Fenster auf dem Desktop leicht erreichen. –
Dies ist nicht zuverlässig. 'GetNextWindow' ruft nur' GetWindow' an. Aus der [GetWindow-Referenz] (https://msdn.microsoft.com/en-us/library/ms633515 (v = V.85) .aspx): "_Eine Anwendung, die GetWindow zum Ausführen dieser Aufgabe aufruft, läuft Gefahr, abgefangen zu werden in einer Endlosschleife oder Verweis auf ein Handle zu einem Fenster, das zerstört wurde. _ " – zett42