获取可用监视器的数量

时间:2018-03-01 07:55:20

标签: c# uwp multiple-monitors

我正在编写一个需要跨越多个监视器的UWP应用程序。作为该要求的一部分,我自然需要知道当前有多少台显示器或显示设备连接到机器。这在UWP中很难做得很好。这些是我迄今为止尝试过的方法,它们不起作用或有限:

  1. Pre-UWP,我会使用Screen.AllScreens中的System.Windows.Forms属性,即使这意味着将WinForms DLL导入WPF应用程序。不幸的是,这不再是UWP中的一个选项。
  2. 使用WMI访问该信息的Win32_Desktopmonitor类 - 再次锁定在UWP中。
  3. 在注册表中查找 - 相同。
  4. 编写外部非UWP实用程序以检索该信息,使用AppService在UWP和非UWP应用程序之间进行通信。对于这个要求来说,这似乎是一个非常复杂的操作。
  5. 使用本机UWP方法,使用ProjectionManager.GetDeviceSelector()获取AQS查询,然后将其传递给DeviceInformation.FindAllAsync以获取监视器计数。此有效,但非常慢。在我的高端笔记本电脑上查询4个显示器(笔记本电脑显示器,两个外部显示器甚至没有启用的WiDi连接)可能需要3-5秒。
  6. 目前,我正在使用选项#5,原生UWP方式。但我想知道这里是否有更简单的东西,这样我就可以更快地检索显示器的数量。

3 个答案:

答案 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兼容。