在使用Windows API方法EnumChildWindows時,我遇到了奇怪的行爲。它似乎沒有拿起一段兒童窗戶。當我使用Spy ++向下鑽取時,我可以看到孩子們,但是當我執行我的代碼時,它不會返回我在Spy ++中看到的那些代碼。EnumChildWindows爲什麼會跳過兒童?
我在間諜++ 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;
}
是否有一個原因,爲什麼在上面的截圖中的紅色突出部分就不會得到填充到我的收藏( List<IntPtr>
)當調用EnumChildWindows?
我在我的FindWindowsByClassAndTitle()函數中實現了這段代碼,它發現窗口比我之前使用的代碼快大約3000萬倍。 – Anders