一尘不染

如何获得监视器的实际名称?如分辨率对话框中所示

c#

我试图获取系统上显示器的友好名称。我正在使用C#。

我已经尝试过了Screen,这才给我//./DisplayXX。我也尝试了Win32_DesktopMonitorEnumDisplayDevices,它们都给我//./DisplayXXOR的变体Generic Monitor,而我知道我的显示名称是SyncMasterand SM2333T

现在,Windows知道了这些监视器是什么, 使用正确的名称在“ 设备和打印机” 窗口以及用于设置位置和分辨率的对话框中显示它们。

我可以从哪里获取这些名称?我已经查看了注册表,但似乎找不到它们,因此任何帮助都将非常有用。

解决方案:
我遇到的问题是EnumDisplayDevices第二次调用时iDevNum再次设置为id,这意味着我试图从错误的位置获取数据,然后将其替换为0,并且效果很好,请参见下面的代码。

    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()));
    }

阅读 240

收藏
2020-05-19

共1个答案

一尘不染

当你得到一个DisplayDevice.DeviceName//./DisplayXEnumDisplayDevices,你应该调用“EnumDisplayDevices”第二次,这次提供“DisplayDevice.DeviceName”你从以前的调用作为了lpDevice,和“0”的iDevNum。然后,您将在中具有监视器名称DisplayDevice.DeviceString

2020-05-19