Windows API 메서드 EnumChildWindows를 사용할 때 이상한 동작이 나타납니다. 그것은 아이들 창문 섹션을 집어 들고 있지 않은 것 같습니다. Spy ++를 사용하여 드릴 다운 할 때 자식을 볼 수 있지만 코드를 실행하면 Spy ++에서 볼 수있는 코드가 반환되지 않습니다.EnumChildWindows가 자식을 건너 뛰는 이유는 무엇입니까?
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;
}
위의 스크린 샷에서 강조 표시된 빨간색 부분은 내 컬렉션으로 채워하지 않을 이유에 이유가 (거기 : 나는 여기 What I see in Spy++ http://img24.imageshack.us/img24/9264/spyhandles.png
++ 스파이에서 볼 무엇
내 코드입니다 List<IntPtr>
) EnumChildWindows를 호출 할 때?
필자는 FindWindowsByClassAndTitle() 함수에서이 코드를 구현했으며 이전에 사용한 코드보다 약 3 천만 배 빠른 윈도우를 찾습니다. – Anders