我试图获取系统上显示器的友好名称。我正在使用C#。
我已经尝试过了Screen,这才给我//./DisplayXX。我也尝试了Win32_DesktopMonitor和EnumDisplayDevices,它们都给我//./DisplayXXOR的变体Generic Monitor,而我知道我的显示名称是SyncMasterand SM2333T。
Screen
//./DisplayXX
Win32_DesktopMonitor
EnumDisplayDevices
Generic Monitor
SyncMaster
SM2333T
现在,Windows知道了这些监视器是什么, 并 使用正确的名称在“ 设备和打印机” 窗口以及用于设置位置和分辨率的对话框中显示它们。
我可以从哪里获取这些名称?我已经查看了注册表,但似乎找不到它们,因此任何帮助都将非常有用。
解决方案: 我遇到的问题是EnumDisplayDevices第二次调用时iDevNum再次设置为id,这意味着我试图从错误的位置获取数据,然后将其替换为0,并且效果很好,请参见下面的代码。
iDevNum
var device = new DISPLAY_DEVICE(); device.cb = Marshal.SizeOf(device); try { for (uint id = 0; EnumDisplayDevices(null, id, ref device, 0); id++) { Console.WriteLine(String.Format("{0}, {1}, {2}, {3}, {4}, {5}", id, device.DeviceName, device.DeviceString, device.StateFlags, device.DeviceID, device.DeviceKey)); Console.WriteLine(); device.cb = Marshal.SizeOf(device); EnumDisplayDevices(device.DeviceName, 0, ref device, 0); Console.WriteLine(String.Format("{0}, {1}, {2}, {3}, {4}, {5}", id, device.DeviceName, device.DeviceString, device.StateFlags, device.DeviceID, device.DeviceKey)); device.cb = Marshal.SizeOf(device); device.cb = Marshal.SizeOf(device); return; } } } catch (Exception ex) { Console.WriteLine(String.Format("{0}", ex.ToString())); }
当你得到一个DisplayDevice.DeviceName像//./DisplayX从EnumDisplayDevices,你应该调用“EnumDisplayDevices”第二次,这次提供“DisplayDevice.DeviceName”你从以前的调用作为了lpDevice,和“0”的iDevNum。然后,您将在中具有监视器名称DisplayDevice.DeviceString。
DisplayDevice.DeviceName
//./DisplayX
lpDevice
DisplayDevice.DeviceString