如何通过编程获取Windows显示/监视器/屏幕标识号?

时间:2019-06-12 20:56:32

标签: windows

在我的应用程序中,我需要允许用户选择显示客户信息的屏幕。在这种情况下,主显示器正面对办公桌旁的人,另一个正面对客户。

该应用程序当前在System.Windows.Forms.Screen.AllScreens(我正在使用C#)中循环,并在下拉菜单中显示Screen对象的DeviceName。通常,显示的是“ \\。\ DISPLAY1”和“ \\。\ DISPLAY2”,但有时会显示“ \\。\ DISPLAY4”和“ \\。\ DISPLAY5”之类的东西-可能是因为其他显示编号1-3的附件已在前面。

我想显示的是Windows设置用来标识已连接的活动显示的数字。在Windows中,右键单击桌面,然后选择“显示设置”。如果您有多台监视器,则将在每个监视器上看到一个数字。单击“识别”将显示这些数字如何映射到每个监视器。

windows display settings

而不是菜单:

  • \\。\ DISPLAY1
  • \\。\ DISPLAY2

我希望它包含屏幕ID。像这样:

  • 显示器(2)
  • 显示器(1)

其中括号中的数字是显示ID。

我尝试从以下WMI CIM中获取它:Win32_DesktopMonitor,Win32_VideoController,Win32_DisplayConfiguration,Win32_Desktop和WmiMonitorID。

我查看了从EnumDisplayDevices和EnumDisplayMonitors返回的信息。

我试图在以下位置找到模式

HKLM \ SYSTEM \ CurrentControlSet \ Enum \ DISPLAY

HKLM \ SYSTEM \ CurrentControlSet \ Control \ GraphicsDrivers \ Configuration

HKLM \ SYSTEM \ CurrentControlSet \ Control \ GraphicsDrivers \ Connectivity

HKLM \ SYSTEM \ CurrentControlSet \ Control \ Video

当我打开系统显示设置时,我甚至跑着命令看是否发生了有趣的事情。

更新:

来自How can I get monitors numbers from Screen Resolution dialog in win7 programmatically?的第二个答案看起来很有希望,但似乎并不正确。

对于Windows 7支持的支持WDDM的Windows版本,您可以简单地使用DXGI,它是DirectX的一部分。 DXGI使您可以轻松地枚举现有的显示适配器,每个适配器可用的显示输出以及每个显示输出支持的显示模式。在枚举的同时,您还可以读取很多其他数据,例如句柄,标识符和设备名称。所有这些都可以轻松地用于检索工作区域。 枚举适配器和输出的顺序由系统定义,并与您的配置屏幕的顺序相匹配。

我使用DXGI包装器SharpDX对此进行了测试:

var factory1 = new Factory1();
var adapters = factory1.Adapters;

int i = 1;

foreach (var adapter in adapters)
{
   Console.WriteLine($"Adapter Description: {adapter.Description.Description}");
   Console.WriteLine("-----------");

   foreach (var output in adapter.Outputs)
   {
      Console.WriteLine($"DeviceName: {output.Description.DeviceName}");
      Console.WriteLine($"DesktopBounds: L:{output.Description.DesktopBounds.Left}, T:{output.Description.DesktopBounds.Top}, R:{output.Description.DesktopBounds.Right}, B:{output.Description.DesktopBounds.Bottom}");

      Console.WriteLine($"ID (?): {i++}");
   }
}

结果:

适配器说明:NVIDIA Quadro M1200

DeviceName:\。\ DISPLAY4

DesktopBounds:L:0,T:0,R:1920,B:1080

ID(?):1

DeviceName:\。\ DISPLAY5

DesktopBounds:L:1920,T:0,R:3840,B:1080

ID(?):2

适配器说明:Intel(R)HD Graphics 630

适配器说明:Microsoft Basic Render驱动程序

根据我的显示设置,左边的监视器\。\ DISPLAY4为2,右边的\。\ DISPLAY5为1。我不能假定顺序是相反的,因为使用家里的同一台计算机,但显示器不同,DISPLAY1(左)是ID = 1,DISPLAY4(右)是ID = 2。

更新2:

我们与Microsoft创建了一张票证,以获取有关此问题的帮助。无法获得Windows用于标识显示设置中的屏幕的编号。  他们的答案总结如下:

How can I get monitors numbers from Screen Resolution dialog in win7 programmatically?

0 个答案:

没有答案