2011-08-10 10 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

上記の引用情報は、私の頭の中で電球を点灯させたものです。

関連する問題