EnumChildWindows 以与我在实际 Window 中看到的不同的顺序获取子 windows

EnumChildWindows get child windows in different order what I see in actual Window

我需要列出 Windows 的所有子控件,但顺序与 window 中出现的顺序完全相同。

我有这个代码;

    public static List<IntPtr> GetWindowControls(IntPtr hWnd)
    {
        List<IntPtr> result = new List<IntPtr>();
        GCHandle listHandle = GCHandle.Alloc(result);

        try
        {
            EnumWindowProc childProc = new EnumWindowProc(EnumWindowControls);
            EnumChildWindows(hWnd, childProc, GCHandle.ToIntPtr(listHandle));
        }
        finally
        {
            if (listHandle.IsAllocated)
                listHandle.Free();
        }
        return result;
    }

    private static bool EnumWindowControls(IntPtr handle, IntPtr pointer)
    {
        GCHandle gch = GCHandle.FromIntPtr(pointer);
        List<IntPtr> list = gch.Target as List<IntPtr>;
        if (list == null)
            throw new InvalidCastException("GCHandle Target could not be cast as List<IntPtr>");

        string className = Helpers.WinApi.GetWinClass(handle).ToUpper();
        if (className.Contains("EDIT") || className.Contains("COMBOBOX") || className.Contains("STATIC") || className.Contains("BUTTON"))
            list.Add(handle);
        return true;
    }

执行该方法后,我得到一个 Windows 列表,但顺序不限。

EnumChildWindows 不会按照您想要的顺序给您 windows。您必须向每个 window 询问其位置,然后根据这些位置自行订购 windows。

您需要决定使用什么顺序。从上到下,然后从左到右。或者从左到右,然后到底部。或者也许是其他命令。

您可以使用 GetWindowRect 获取每个 window 的边界矩形。

EnumChildWindows 通过将句柄传递给每个子 window 来枚举属于指定父 window 的子 windows,它们是基于 windows Z 枚举的订单。

为所有 windows 设置正确的 Z 顺序将解决您的问题