Что такое эквивалентный код C # 2.0 этого лямбда-выражения - PullRequest
2 голосов
/ 23 февраля 2012

Мне нужна функциональность, которая перечисляется через открытые окна проводника. И вот код, который я получил:

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

У меня вопрос в первом блоке кода, как мне заменить лямбда-выражение, чтобы я мог скомпилировать код с использованием C # 2.0 в VS 2005.

Ответы [ 2 ]

2 голосов
/ 23 февраля 2012

Создайте новый метод для передачи в 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

1 голос
/ 23 февраля 2012
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;
}
...