1

我正在尝试编写一个函数,该函数在顶级窗口上进行迭代,如果它们满足一组标准,则将它们放入列表中。目前,我可以通过将窗口添加到静态List<IntPtr> instances变量中来使其工作,但我想改为将指针传递给EnumWindowsProc'slParam中的列表以避免此静态变量。

我想我必须用它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

You could call the EnumWindows function with an lambda expression. Then the EnumWindowsProc Callback would be inline and you can access to local variables:

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

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

      return true;

}, IntPtr.Zero);

You could capsulate this inline call in an extra function, e.g.:

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 回答