首页 > 解决方案 > C#如何正确读取/显示所有监视器

问题描述

我阅读了 PC 上的所有显示器,并且可以正常工作。问题是,结果是这样的:

戴尔 P2419HDELL P2418D

我想要这样的结果:

戴尔 P2419H、戴尔 P2418D

这是我当前的代码:

var searcher = new ManagementObjectSearcher(@"root\wmi", "SELECT * FROM WmiMonitorID");
foreach (ManagementObject ufn in searcher.Get())
{
    if (ufn["UserFriendlyName"] == null)
    {
        monitorModel = "No description";
    }
    else
    {
        ushort[] ufnArray = (ushort[])ufn["UserFriendlyName"];
        foreach (ushort ufnValue in ufnArray)
        {
            var ufnASCIIBytes = new byte[] { (byte)ufnValue };
            monitorModel += Encoding.ASCII.GetString(ufnASCIIBytes);
        }
    }
}

如果我这样写代码:

monitorModel += Encoding.ASCII.GetString(ufnASCIIBytes) + ", ";

结果是

D, E, L, L, , P, 2, 4, [等等]

标签: c#monitor

解决方案


这是一种将所有监视器枚举为单独名称的方法,让调用者根据需要进行字符串连接操作......我还注意到字符串末尾有一些空字符,Encoding.ASCII.GetString()这也删除了这些字符。

void Main()
{
    Console.WriteLine(string.Join(", ", EnumerateMonitors()));
}

public IEnumerable<string> EnumerateMonitors() =>
    new ManagementObjectSearcher(@"root\wmi", "SELECT * FROM WmiMonitorID").Get()
        .OfType<ManagementBaseObject>()
        .Select(mo => string.Join(
            string.Empty,
            ((ushort[])(mo["UserFriendlyName"] ?? "No description"))
                .Select(x => Encoding.ASCII.GetString(new[] { (byte)x }).Replace("\0", string.Empty))));

推荐阅读