我正在尝试在我的应用程序中进行屏幕捕获,其中我捕获当前显示。我一直在使用
GraphicsCaptureItem.TryCreateFromDisplayId(Windows.Graphics.DisplayId)
和虚拟 new DisplayId(0)
,但这捕获了我的两个显示器之间的一个点。不幸的是, DisplayId
类并未指示我如何创建具有正确值的类。
如何正确创建
Windows.Graphics.DisplayId
?或者我怎样才能得到一个 Windows.UI.WindowId
,而不是 .TryCreateFromWindowId
?
DisplayId
类似乎是HMONITOR
的简单包装,因此您可以根据需要获得HMONITOR
并将其转换为DisplayId
(WindowId
s似乎也可以是 HWND
的包装)。例如,使用 CsWin32(或手动 PInvoke)来使用 MonitorFromWindow
API:
// Get the display for an arbitrary HWND
internal static DisplayId GetDisplayIdForHwnd(HWND hwnd)
{
Windows.Win32.Graphics.Gdi.HMONITOR monitor = Windows.Win32.PInvoke.MonitorFromWindow(hwnd, Windows.Win32.Graphics.Gdi.MONITOR_FROM_FLAGS.MONITOR_DEFAULTTOPRIMARY);
var displayId = new DisplayId((ulong)monitor.Value);
return displayId;
}
// Get the default display by harnessing `MONITOR_DEFAULTTOPRIMARY`
public static DisplayId GetDefaultDisplayId()
{
return GetDisplayIdForHwnd(HWND.Null);
}
EnumDisplayMonitors
这样的 API 来枚举 HMONITOR
s。
Win32Interop.GetDisplayIdFromMonitor(IntPtr)
,反之亦然)。然而,Interop API 实际上返回一个 Microsoft.UI.DisplayId
,您无论如何都需要手动将其转换为 Windows.Graphics.DisplayId
:
Windows.Graphics.DisplayId FromMicrosoftDisplayId(Microsoft.UI.DisplayId displayID)
{
return new Windows.Graphics.DisplayId(displayID.Value);
}