Nice và ngắn gọn:
int GetZOrder(IntPtr hWnd)
{
var z = 0;
for (var h = hWnd; h != IntPtr.Zero; h = GetWindow(h, GW.HWNDPREV)) z++;
return z;
}
Nếu bạn cần độ tin cậy hơn:
/// <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;
}
(Theo chú thích phần trên GetWindow
, EnumChildWindows
an toàn hơn gọi số GetWindow
trong vòng lặp vì vòng lặp GetWindow
của bạn không phải là nguyên tử đối với các thay đổi bên ngoài. Theo phần Tham số cho EnumChildWindows
, gọi với cha mẹ null là tương đương với EnumWindows
.)
Sau đó, thay vì một cuộc gọi riêng biệt để EnumWindows
cho mỗi cửa sổ, mà cũng sẽ không thể nguyên tử và an toàn từ những thay đổi đồng thời, bạn gửi mỗi cửa sổ bạn muốn so sánh trong một mảng tham số để tất cả các đơn đặt hàng z của chúng đều có thể được truy xuất cùng một lúc.
Và "máy tính để bàn" có thể được sử dụng làm cửa sổ chính bằng cách chỉ định null cho cha mẹ. Do đó bạn có thể dễ dàng có được cửa sổ cấp cao nhất trên màn hình nền. –
Điều này không đáng tin cậy. 'GetNextWindow' chỉ gọi' GetWindow'. Từ tham chiếu ['GetWindow'] (https://msdn.microsoft.com/en-us/library/ms633515 (v = vs.85) .aspx):" _An ứng dụng gọi GetWindow để thực hiện nhiệm vụ này, nguy cơ bị bắt trong một vòng lặp vô hạn hoặc tham chiếu đến một cửa sổ đã bị phá hủy._ " – zett42