なつねこメモ

主にプログラミング関連のメモ帳 ♪(✿╹ヮ╹)ノ 書いてあるコードは自己責任でご自由にどうぞ。記事本文の無断転載は禁止です。

UWP API の GraphicsCapture で Window Handle をソースとして使いたい

久々の C# ネタ、かつ UWP ネタということで、今年春のアップデートでできるようになった事についてご紹介。
UWP でスクリーンショットや動画の撮影などに使える GraphicsCapture API で、
Win32 API でおなじみの hWnd をソースとして使えるようになっていました。

ということで使い方をサクッと紹介。


といってもほぼほぼ公式サンプルそのままです。
前提条件として

  • .NET Framework 4.7
  • WPF
  • Microsoft.Windows.SDK.Contracts

が導入・使用されているものとします。

[ComImport]
[Guid("3628E81B-3CAC-4C60-B7F4-23CE0E0C3356")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IGraphicsCaptureItemInterop
{
    IntPtr CreateForWindow([In] IntPtr hWnd, ref Guid iid);

    IntPtr CreateForMonitor([In] IntPtr hMonitor, ref Guid iid);
}

// hWnd から GraphicsCaptureItem を作ってあげる
public static class UwpInterop
{
    public static GraphicsCaptureItem CreateItemForWindow(IntPtr hWnd)
    {
        var factory = WindowsRuntimeMarshal.GetActivationFactory(typeof(GraphicsCaptureItem));
        var interop = (IGraphicsCaptureItemInterop) factory;
        var iid = typeof(GraphicsCaptureItem).GetInterface("IGraphicsCaptureItem").GUID;
        var pointer = interop.CreateForWindow(hWnd, ref iid);
        var capture = Marshal.GetObjectForIUnknown(pointer) as GraphicsCaptureItem;
        Marshal.Release(pointer);

        return capture;
    }
}

上で定義されている hMonitor についても、同様の方法で GraphicsCaptureItem を作ることが出来ます。
この後の使い方は、通常通り GraphicsCaptureItem を使うのと同じ感じで使うことができます。

ということでではでは~