gayaK / LinqToPInvoke

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

LinqToPInvoke

This library enables LINQ query in P/Invoke methods which are using callbacks (e.g. EnumWindos).

Example

Define

delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam);

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, IntPtr lParam);

static void EnumWindows(Func<IPInvokeObservable<IntPtr>, IPInvokeQueryEndNode> query)
{
    var startNode = new PInvokeQueryStartNode<IntPtr>();
    var endNode = query(startNode);
    EnumWindows((hwnd, _) => startNode.OnNext(hwnd), IntPtr.Zero);
}

static T EnumWindows<T>(Func<IPInvokeObservable<IntPtr>, IPInvokeQueryEndNode<T>> query)
{
    var startNode = new PInvokeQueryStartNode<IntPtr>();
    var endNode = query(startNode);
    EnumWindows((hwnd, _) => startNode.OnNext(hwnd), IntPtr.Zero);

    return endNode.ProvideResult();
}

Usage

// method chain + ToList()
var list = EnumWindows(x => x
    .Where(y => IsWindowVisible(y))
    .Select(y => y.ToInt32().ToString("X8"))
    .Take(10)
    .ToList());

// query syntax + ForEach()
EnumWindows(x => (from y in x
                  where IsWindowVisible(y)
                  select y.ToInt32().ToString("X8"))
                  .Take(10)
                  .ForEach(y => list.Add(y)));

About

License:MIT License


Languages

Language:C# 100.0%