为什么EnumChildWindows会跳过孩子?

时间:2011-08-10 16:16:42

标签: c# winapi

在使用Windows API方法EnumChildWindows时,我遇到了奇怪的行为。似乎没有拿起一段儿童窗户。当我使用Spy ++向下钻取时,我可以看到子节点,但是当我执行代码时,它不会返回我在Spy ++中看到的代码。

我在Spy ++中看到的 What I see in Spy++ http://img24.imageshack.us/img24/9264/spyhandles.png

这是我的代码:

public delegate bool EnumWindowProc(IntPtr hWnd, IntPtr parameter);

    [DllImport("user32")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool EnumChildWindows(IntPtr window, EnumWindowProc callback, IntPtr i);

    public static List<IntPtr> GetChildWindows(IntPtr parent)
    {
        List<IntPtr> result = new List<IntPtr>();
        GCHandle listHandle = GCHandle.Alloc(result);
        try
        {
            EnumWindowProc childProc = new EnumWindowProc(EnumWindow);
            EnumChildWindows(parent, childProc, GCHandle.ToIntPtr(listHandle));
        }
        finally
        {
            if (listHandle.IsAllocated)
                listHandle.Free();
        }
        return result;
    }

    private static bool EnumWindow(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>");

        list.Add(handle);            
        return true;
    }

为什么在调用EnumChildWindows时,为什么上面屏幕截图中突出显示的红色部分不会填充到我的集合(List<IntPtr>)中?

1 个答案:

答案 0 :(得分:8)

卫生署!我发现了我的方式的错误。我之所以只有一半的孩子是因为我没有等待足够的时间让窗户最初装载并在其中创建所有的孩子,因此我只得到了它创建的前半部分。我正在调用我的函数来获取所有子窗口。所以我在调用EnumChildWindows()之前添加了一行代码来休眠。

  

“Windows不会为调用EnumChildWindows之后但返回之前创建的任何子窗口调用回调函数。” - Source

以上引用的信息是我脑子里的灯泡打开的原因。