为什么EnumChildWindows会跳过孩子?

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

我在Spy ++中看到的内容我在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 GetChildWindows(IntPtr parent) { List result = new List(); 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 list = gch.Target as List; if (list == null) throw new InvalidCastException("GCHandle Target could not be cast as List"); list.Add(handle); return true; } 

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

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

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

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