C# 讀取螢幕資訊

可以取得筆電及外接螢幕的資訊

exe執行檔下載

螢幕廠商 / 型號 / 序號

WmiMonitorID

using System.Management;

static void Main()
{
    var searcher = new ManagementObjectSearcher(
        @"root\wmi",
        "SELECT * FROM WmiMonitorID");

    foreach (ManagementObject obj in searcher.Get())
    {
        Console.WriteLine("===== Monitor =====");
        Console.WriteLine("Manufacturer : " + Decode(obj["ManufacturerName"]));
        Console.WriteLine("Product Code : " + Decode(obj["ProductCodeID"]));
        Console.WriteLine("Serial Number: " + Decode(obj["SerialNumberID"]));
        Console.WriteLine("User Friendly: " + Decode(obj["UserFriendlyName"]));
        Console.WriteLine(obj["InstanceName"]?.ToString());
    }
}

static string Decode(object value)
{
    if (value == null) return "";

    byte[] bytes = (byte[])value;
    return Encoding.ASCII.GetString(bytes).TrimEnd('\0');
}

螢幕實體尺寸(公分)

WmiMonitorBasicDisplayParams

var searcher = new ManagementObjectSearcher(
    @"root\wmi",
    "SELECT * FROM WmiMonitorBasicDisplayParams");

foreach (ManagementObject obj in searcher.Get())
{
    Console.WriteLine("Max Horizontal Size (cm): " + obj["MaxHorizontalImageSize"]);
    Console.WriteLine("Max Vertical Size (cm): " + obj["MaxVerticalImageSize"]);
}

目前解析度(顯卡輸出)

Win32_VideoController

var searcher = new ManagementObjectSearcher(
    "SELECT * FROM Win32_VideoController");

foreach (ManagementObject obj in searcher.Get())
{
    Console.WriteLine("Name: " + obj["Name"]);
    Console.WriteLine("Resolution: " +
        obj["CurrentHorizontalResolution"] + " x " +
        obj["CurrentVerticalResolution"]);
}

Register註冊表內所有EDID

static void Main()
{
    string displayKey = @"SYSTEM\CurrentControlSet\Enum\DISPLAY";

    using (RegistryKey baseKey = Registry.LocalMachine.OpenSubKey(displayKey))
    {
        if (baseKey == null) return;

        foreach (string vendor in baseKey.GetSubKeyNames())
        {
            using (RegistryKey vendorKey = baseKey.OpenSubKey(vendor))
            {
                foreach (string deviceId in vendorKey.GetSubKeyNames())
                {
                    using (RegistryKey deviceKey = vendorKey.OpenSubKey(deviceId + @"\Device Parameters"))
                    {
                        if (deviceKey == null) continue;

                        byte[] edid = deviceKey.GetValue("EDID") as byte[];
                        if (edid != null)
                        {
                            Console.WriteLine($"EDID for {vendor} {deviceId}, length: {edid.Length}");
                            Console.WriteLine(BitConverter.ToString(edid).Replace("-", " "));
                        }
                    }
                }
            }
        }
    }
}

筆電螢幕的EDID

private void button7_Click(object sender, EventArgs e)
{
    int count = Screen.AllScreens.Length;
    if(count < 1) return;

    // Find Internal Monitor
    var searcher = new ManagementObjectSearcher(
        @"root\wmi",
        "SELECT * FROM WmiMonitorID");

    //string curmonitor = "";
    string[] monitors = new string[count];
    int j = 0;
    foreach (ManagementObject obj in searcher.Get())
    {
        monitors[j++] = obj.ToString();
    }

    //
    j = 0;
    string displayKey = @"SYSTEM\CurrentControlSet\Enum\DISPLAY";
    using (RegistryKey baseKey = Registry.LocalMachine.OpenSubKey(displayKey))
    {
        if (baseKey == null) return;

        foreach(string name in monitors)
        {
            foreach (string vendor in baseKey.GetSubKeyNames())
            {
                if (monitors[j].IndexOf(vendor) < 0) continue;
                using (RegistryKey vendorKey = baseKey.OpenSubKey(vendor))
                {
                    foreach (string deviceId in vendorKey.GetSubKeyNames())
                    {
                        if(monitors[j].IndexOf(deviceId) < 0) continue;
                        using (RegistryKey edidKey = vendorKey.OpenSubKey(deviceId + @"\Device Parameters"))
                        {
                            if (edidKey != null)
                            {
                                byte[] edid = edidKey.GetValue("EDID") as byte[];
                                if (edid != null)
                                {
                                    Console.WriteLine($"=== Laptop Internal Display EDID ( {vendor} {deviceId} ) ===");
                                    Console.WriteLine($"EDID length: {edid.Length}\n");

                                    // 每行 16 bytes,顯示位址偏移
                                    for (int i = 0; i < edid.Length; i += 16)
                                    {
                                        int lineLength = Math.Min(16, edid.Length - i);
                                        byte[] lineBytes = new byte[lineLength];
                                        Array.Copy(edid, i, lineBytes, 0, lineLength);

                                        // 偏移 + hex 顯示
                                        string hexLine = BitConverter.ToString(lineBytes).Replace("-", " ");
                                        Console.WriteLine($"{i:X4}: {hexLine}");
                                    }
                                    Console.WriteLine("\n");
                                }
                            }
                        }
                    }
                }
            }

            j++;
        }
    }
}



留言