如何在 C# 中获取“GraphicsCaptureItem.TryCreateFromDisplayId”的“DisplayId”?

问题描述 投票:0回答:1

我正在尝试在我的应用程序中进行屏幕捕获,其中我捕获当前显示。我一直在使用

GraphicsCaptureItem.TryCreateFromDisplayId(Windows.Graphics.DisplayId)
和虚拟
new DisplayId(0)
,但这捕获了我的两个显示器之间的一个点。不幸的是,
DisplayId
类并未指示我如何创建具有正确值的类。

如何正确创建

Windows.Graphics.DisplayId
?或者我怎样才能得到一个
Windows.UI.WindowId
,而不是
.TryCreateFromWindowId

c# windows .net-core screen-capture
1个回答
0
投票

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。


如果您使用 WinAppSDK,则有一个官方 API(

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.