久々の 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
を使うのと同じ感じで使うことができます。
ということでではでは~