将List <intptr> *传递给C#</intptr>中的EnumWindows'lParam

时间:2012-12-20 13:40:18

标签: c# winapi interop marshalling fixed

我正在尝试编写一个迭代顶级窗口的函数,如果它们满足一组条件,则将它们放入列表中。目前我可以通过将窗口添加到静态List<IntPtr> instances变量中来实现此功能,但我希望将指针传递给EnumWindowsProc的{​​{1}}中的列表。为了避免这个静态变量。

我想我必须使用lParam来修复列表在内存中的位置,但我不确定如何执行此操作。我试过这个将列表传递给我的回调函数:

fixed

但我得到

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

我对c#很新,所以我真的不知道如何做到这一点 - 或者即使可能,我已经读过,编组包含引用的托管类型是不可能的,但我只需要在内存中修复它创建一个指向它的指针,然后将指针强制转换并使用它。如果有的话,我怎样才能完成这项工作?

1 个答案:

答案 0 :(得分:2)

您可以使用lambda表达式调用EnumWindows函数。然后EnumWindowsProc Callback将是内联的,您可以访问本地变量:

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