在我的应用程序中,我需要允许用户选择显示客户信息的屏幕。在这种情况下,主显示器正面对办公桌旁的人,另一个正面对客户。
该应用程序当前在System.Windows.Forms.Screen.AllScreens(我正在使用C#)中循环,并在下拉菜单中显示Screen对象的DeviceName。通常,显示的是“ \\。\ DISPLAY1”和“ \\。\ DISPLAY2”,但有时会显示“ \\。\ DISPLAY4”和“ \\。\ DISPLAY5”之类的东西-可能是因为其他显示编号1-3的附件已在前面。
我想显示的是Windows设置用来标识已连接的活动显示的数字。在Windows中,右键单击桌面,然后选择“显示设置”。如果您有多台监视器,则将在每个监视器上看到一个数字。单击“识别”将显示这些数字如何映射到每个监视器。
而不是菜单:
我希望它包含屏幕ID。像这样:
其中括号中的数字是显示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?