1

トップレベルのウィンドウを反復処理し、一連の基準を満たしている場合にそれらをリストに入れる関数を作成しようとしています。現時点では、静的変数にウィンドウを追加することでこれを機能させることができますが、この静的変数を回避するために、代わりにのList<IntPtr> instancesリストへのポインターを渡したいと思います。EnumWindowsProclParam

fixedメモリー内のリストの位置を修正するために使用する必要があると思いますが、これを行う方法がわかりません。リストをコールバック関数に渡すためにこれを試しました:

unsafe
{
    fixed (void* dp = &instances)
    {
        WinApi.EnumWindows(new WinApi.EnumWindowsProc(FindPPWindows), dp);
    }
}

しかし、私は得る

Cannot take the address of, get the size of, or declare a pointer to a managed type ('System.Collections.GenericList<IntPtr>')

私はc#に慣れていないので、これを行う方法がよくわかりません-または、可能であっても、参照を含むマネージドタイプをマーシャリングすることは不可能であると読みましたが、メモリ内で修正してポインターを作成するだけで済みますそれにポインタを戻し、それを使用します。どうすればこれを機能させることができますか?

4

1 に答える 1

2

ラムダ式を使用して EnumWindows 関数を呼び出すことができます。次に、EnumWindowsProc コールバックがインラインになり、ローカル変数にアクセスできます。

List<IntPtr> list = new List<IntPtr>();            

WinApi.EnumWindows((hWnd, lParam) =>
{
      //check conditions
      list.Add(hWnd);

      return true;

}, IntPtr.Zero);

このインライン呼び出しを追加の関数でカプセル化できます。たとえば、次のようになります。

List<IntPtr> GetMatchingHWnds()
{
    List<IntPtr> list = new List<IntPtr>();            

    WinApi.EnumWindows((hWnd, lParam) =>
    {
          //check conditions
          list.Add(hWnd);

          return true;

    }, IntPtr.Zero);

    return list;        
}
于 2012-12-22T09:52:48.653 に答える