2011-08-10 105 views
10

在使用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?

+0

我在我的FindWindowsByClassAndTitle()函數中實現了這段代碼,它發現窗口比我之前使用的代碼快大約3000萬倍。 – Anders

回答

8

Doh!我發現了我的方式的錯誤。之所以我只得到一半的孩子,是因爲我沒有等待足夠長的時間讓窗口初始加載並創建其中的所有孩子,因此我只獲得了它在當時我正在調用我的函數來獲取所有子窗口。所以我在調用EnumChildWindows()之前添加了一行代碼。

「Windows不調用EnumChildWindows被調用但在返回之前創建的任何子窗口的回調函數。」 - Source

上面引用的那條信息就是把燈泡放在我頭上的東西。