【问题标题】:What is the C# 2.0 equivalent code of this lambda expression这个 lambda 表达式的 C# 2.0 等效代码是什么
【发布时间】:2013-05-15 15:43:14
【问题描述】:

我需要一个通过打开的资源管理器窗口进行枚举的功能。这是我得到的代码:

delegate bool EnumThreadDelegate(IntPtr hWnd, IntPtr lParam);

[DllImport("user32.dll")]
static extern bool EnumThreadWindows(int dwThreadId, EnumThreadDelegate lpfn, IntPtr lParam);

static IEnumerable<IntPtr> EnumerateProcessWindowHandles(int processID)
{
    List<IntPtr> handles = new List<IntPtr>();

    foreach (ProcessThread thread in Process.GetProcessById(processID).Threads)
    {                                //what is the magic going on beneath this?? :o
        EnumThreadWindows(thread.Id, (hWnd, lParam) => { handles.Add(hWnd); return true;}, IntPtr.Zero);
    }
    return handles;
}

代码在这里继续如下:

[DllImport("coredll.dll")]
static extern int ShowWindow(IntPtr hWnd, int nCmdShow);

const int SW_MINIMIZED = 6;

private void button1_Click(object sender, EventArgs e)
{
    foreach (IntPtr handle in EnumerateProcessWindowHandles(Process.GetProcessesByName("explorer")[0].Id))
    {
        ShowWindow(handle, SW_MINIMIZED);
    }
}

我的问题是,在第一个代码块中,如何替换 lambda 表达式以便我可以在 VS 2005 中使用 C# 2.0 编译代码。

【问题讨论】:

    标签: lambda c#-3.0 c#-2.0


    【解决方案1】:

    创建一个新方法以传递给EnumThreadWindows,如下所示:

    static bool EnumThreadCallback(IntPtr hWnd, IntPtr lParam)
    {
        // Close the enumerated window.
        PostMessage(hWnd, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
    
        return true;
    }
    

    并派一个代表一起去:

    public delegate bool EnumThreadDelegate (IntPtr hWnd, IntPtr lParam);
    

    然后像这样调用函数:

    foreach (ProcessThread pt in proc.Threads)
    {
        EnumThreadWindows((uint)pt.Id, new EnumThreadDelegate(EnumThreadCallback), IntPtr.Zero); 
    }
    

    来源:http://www.pinvoke.net/default.aspx/user32/EnumThreadWindows.html

    【讨论】:

      【解决方案2】:
      delegate bool EnumThreadDelegate(IntPtr hWnd, IntPtr lParam);
      
      static IEnumerable<IntPtr> EnumerateProcessWindowHandles(int processID)
      {
          List<IntPtr> handles = new List<IntPtr>();
      
          EnumThreadDelegate addWindowHandle = delegate(IntPtr hWnd, IntPtr param)
          {
              handles.Add(hWnd); 
              return true;
          };
      
          foreach (ProcessThread thread in Process.GetProcessById(processID).Threads)
          {
              EnumThreadWindows(thread.Id, addWindowHandle, IntPtr.Zero);
          }
          return handles;
      }
      

      【讨论】:

      • 这似乎正是我正在寻找的!我很快就会回来
      猜你喜欢
      • 2015-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      相关资源
      最近更新 更多