2011-08-10 5 views
10

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를 호출 할 때?

+0

필자는 FindWindowsByClassAndTitle() 함수에서이 코드를 구현했으며 이전에 사용한 코드보다 약 3 천만 배 빠른 윈도우를 찾습니다. – Anders

답변

8

Doh! 나는 내 방식의 오류를 발견했다. 내가 아이들의 절반 밖에 얻지 못하는 이유는 처음에 창을로드하고 그 안에 모든 자식을 생성하기 위해 창을 기다릴만큼 오래 기다리지 못했기 때문입니다. 따라서 나는 창에서 생성 한 전반을 얻고있었습니다. 모든 자식 창을 얻기 위해 함수를 호출하고있었습니다. 그래서 EnumChildWindows()를 호출하기 전에 잠자기 코드를 추가했습니다.

"EnumChildWindows가 호출되었지만 반환되기 전에 생성 된 모든 하위 창에 대해 콜백 함수가 호출되지 않습니다." - Source

위의 인용 된 정보는 내 머리 속의 전구를 켜는 것입니다.

관련 문제