我正在编写一个需要跨越多个监视器的UWP应用程序。作为该要求的一部分,我自然需要知道当前有多少台显示器或显示设备连接到机器。这在UWP中很难做得很好。这些是我迄今为止尝试过的方法,它们不起作用或有限:
Screen.AllScreens
中的System.Windows.Forms
属性,即使这意味着将WinForms DLL导入WPF应用程序。不幸的是,这不再是UWP中的一个选项。Win32_Desktopmonitor
类 - 再次锁定在UWP中。ProjectionManager.GetDeviceSelector()
获取AQS查询,然后将其传递给DeviceInformation.FindAllAsync
以获取监视器计数。此有效,但非常慢。在我的高端笔记本电脑上查询4个显示器(笔记本电脑显示器,两个外部显示器甚至没有启用的WiDi连接)可能需要3-5秒。 目前,我正在使用选项#5,原生UWP方式。但我想知道这里是否有更简单的东西,这样我就可以更快地检索显示器的数量。
答案 0 :(得分:0)
尝试P / Invoke到User32
API(或任何其他不受支持的API)可能今天工作,但Microsoft不支持它,无法提交到Windows存储,并可能停止使用未来的Windows Update。您永远不应该依赖应用程序上不受支持的功能。
UWP目前对多个屏幕或窗口没有很好的支持,但如果你的应用只有Destkop,你可以使用Desktop Bridge component找出你有多少台显示器,并定位任何传统的WinForms / WFP窗口。
但您可能无法使用Desktop Bridge组件来调整或移动UWP窗口(很多User32
API都会失败)。
答案 1 :(得分:0)
对于原生 UWP 方法 (#5),我查看了查询字符串,它类似于:
"(System.Devices.DevObjectType:=5 AND System.Devices.Aep.ProtocolId:=\"{XXXX}\" AND System.Devices.WiFiDirect.Services:~=\"Miracast\") OR(System.Devices.DevObjectType:=8 AND System.Devices.InterfaceClassGuid:=\"{XXXX}\" AND System.Devices.InterfaceEnabled:=System.StructuredQueryType.Boolean#True)"
如果我在“OR”之前删除部分,则不再需要 5 秒!我相信第一部分是获取 wifi 设备,这在我的项目中我不在乎。因此,解决方案是仅使用“OR”之后的查询传递给 FindAllAsync() 并获取本地设备。
答案 2 :(得分:-1)
我会看一下Windows.UI.ViewManagement.ProjectionManager.GetDeviceSelector()
https://docs.microsoft.com/en-us/uwp/api/windows.ui.viewmanagement.projectionmanager
我目前在UWP项目中使用ProjectionManager与辅助屏幕进行交互,并且我的应用程序与Windows Store兼容。