2011-12-17 21 views
0

私はこれらのトピックを完全に理解していません。私はいくつかのWinAPIの方法デリゲートとコールバックはどのように機能しますか?

public delegate bool Win32Callback(IntPtr hwnd, ref IntPtr lParam); 

[DllImport("user32.Dll")] 
[return: MarshalAs(UnmanagedType.Bool)] 
public static extern bool EnumChildWindows(IntPtr parentHandle, Win32Callback callback, IntPtr lParam); 

public static bool BrowserEnumChildrenCallback(IntPtr hWnd, ref IntPtr lParam) 
{ 
    if (hWndMeetsConditions) 
     return true; 
    //code 
    return false; 
} 

と連携

は、それがBrowserEnumChildrenCallbackからtrueを返したためhWndを可能得ますか?

Win32Callback callBack = new MainWindow.Win32Callback(BrowserEnumChildrenCallback); 
if (EnumChildWindows(hWnd, callBack, hWnd)) 
{ 
    //here 
} 
+0

問題は何ですか? - より具体的にすることができますか? – Niklas

+0

@Niklas最後の「コード」。 hWndはどのように返されたのですか?今は同じではありません。 – Saint

答えて

3

いくつかの問題:

  • デリゲートの宣言が間違っている、最後の引数はのIntPtr、ないREFのIntPtrです。
  • 反復処理を続行するには、コールバックをtrueに戻す必要があります。
  • EnumChildWindows()コールの後にGC.KeepAlive(callBack)を書き込むと、デリゲートオブジェクトのガベージコレクションが行われません。
  • EnumChildWindows()の戻り値を使用しないでください。SDKドキュメントでは、使用されていないことに注意してください。ウィンドウを見つけないことで障害を検出します。

実際の質問に答える:クラスのフィールドにウィンドウハンドルを保存します。したがって:

private IntPtr windowFound; 

private void iterateChildWindows(IntPtr parent) { 
    windowFound = IntPtr.Zero; 
    var callBack = new MainWindow.Win32Callback(BrowserEnumChildrenCallback); 
    EnumChildWindows(parent, callBack, IntPtr.Zero); 
    GC.KeepAlive(callBack); 
    if (windowFound != IntPtr.Zero) { 
     // etc.. 
    } 
} 

private bool BrowserEnumChildrenCallback(IntPtr hWnd, IntPtr lParam) 
{ 
    if (hWndMeetsConditions(hWnd)) { 
     windowFound = hWnd; 
     return false; 
    } 
    return true; 
} 

ラムダもうまくいきます。

1
List<IntPtr> _hwnds = new List<IntPtr>(); 
public static bool BrowserEnumChildrenCallback(IntPtr hWnd, ref IntPtr lParam) 
{  
    if (hWndMeetsConditions)   
    { 
      _hwnds.Add(hWnd); 
      return true;  
    } 

    //code  
    return false; 
} 

Win32Callback callBack = new MainWindow.Win32Callback(BrowserEnumChildrenCallback); 
if (EnumChildWindows(hWnd, callBack, hWnd)) 
{  
    // here 
    // you have it in _hwnd 
} 
関連する問題