2011-08-10 17 views
10

EnumChildWindows, Windows API yöntemi kullanıldığında garip davranış alıyorum. Çocuk pencerelerinin bir bölümünü toplamadığı görülüyor. Ben Spy ++ kullanarak detaylandırdığımda çocukları görebiliyorum, ancak kodumu çalıştırdığımda, Spy ++'da gördüğümleri geri getirmiyor.EnumChildWindows neden çocukları atlıyor?

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; 
    } 

yukarıdaki ekran görüntüsünde vurgulanan kırmızı bölüm koleksiyonuma içine doldurulan olmazdı neden olarak bir neden (var mı: Ben burada What I see in Spy++ http://img24.imageshack.us/img24/9264/spyhandles.png

++ Spy görmek ne

benim kodudur EnumChildWindows'u çağırırken List<IntPtr>)?

+0

Bu kodu FindWindowsByClassAndTitle() işlevimde uygulamıştım ve pencereleri daha önce kullandığım koddan yaklaşık 30 milyon kat daha hızlı buluyor. – Anders

cevap

8

Doh! Yollarımın hatalarını keşfettim. Çocukluğun sadece yarısını almamın sebebi, pencerenin başlangıçta yüklediği ve içindeki tüm çocukları yaratacağı için yeterince beklememem olmasından kaynaklandı. Tüm çocuk pencerelerini elde etmek için fonksiyonumu çağırıyordum. Bu yüzden EnumChildWindows() 'ı çağırmadan önce uyumak için bir kod satırı ekledim.

"Windows, EnumChildWindows çağrıldıktan sonra oluşturulan herhangi bir alt pencere için geri arama işlevini çağırmaz, ancak geri dönmeden önce." - bilginin Source

yukarıda alıntılanan parça kafamda ampulü döndü budur.

İlgili konular