C#采集电脑硬件(CPU、GPU、硬盘、内存等)温度和使用状况

这是采集出来的Json,部分电脑(特别是笔记本)无法获取到:

csharp 复制代码
{
	"HardwareList": [{
		"Name": "MITX-6999",
		"Type": "主板",
		"Sensors": [],
		"WmiReport": null
	}, {
		"Name": "Intel Core i5-8500",
		"Type": "CPU",
		"Sensors": [{
			"Name": "CPU Core #1",
			"Type": "Load",
			"Value": 7.142857,
			"Unit": "%"
		}, {
			"Name": "CPU Core #2",
			"Type": "Load",
			"Value": 7.142857,
			"Unit": "%"
		}, {
			"Name": "CPU Core #3",
			"Type": "Load",
			"Value": 7.142857,
			"Unit": "%"
		}, {
			"Name": "CPU Core #4",
			"Type": "Load",
			"Value": 7.142857,
			"Unit": "%"
		}, {
			"Name": "CPU Core #5",
			"Type": "Load",
			"Value": 14.2857141,
			"Unit": "%"
		}, {
			"Name": "CPU Core #6",
			"Type": "Load",
			"Value": 14.2857141,
			"Unit": "%"
		}, {
			"Name": "CPU Total",
			"Type": "Load",
			"Value": 9.523809,
			"Unit": "%"
		}, {
			"Name": "CPU Core #1",
			"Type": "Temperature",
			"Value": 45.0,
			"Unit": "°C"
		}, {
			"Name": "CPU Core #2",
			"Type": "Temperature",
			"Value": 44.0,
			"Unit": "°C"
		}, {
			"Name": "CPU Core #3",
			"Type": "Temperature",
			"Value": 43.0,
			"Unit": "°C"
		}, {
			"Name": "CPU Core #4",
			"Type": "Temperature",
			"Value": 44.0,
			"Unit": "°C"
		}, {
			"Name": "CPU Core #5",
			"Type": "Temperature",
			"Value": 44.0,
			"Unit": "°C"
		}, {
			"Name": "CPU Core #6",
			"Type": "Temperature",
			"Value": 43.0,
			"Unit": "°C"
		}, {
			"Name": "CPU Package",
			"Type": "Temperature",
			"Value": 45.0,
			"Unit": "°C"
		}, {
			"Name": "CPU Core #1",
			"Type": "Clock",
			"Value": 3900.00073,
			"Unit": "MHz"
		}, {
			"Name": "CPU Core #2",
			"Type": "Clock",
			"Value": 3900.00073,
			"Unit": "MHz"
		}, {
			"Name": "CPU Core #3",
			"Type": "Clock",
			"Value": 3900.00073,
			"Unit": "MHz"
		}, {
			"Name": "CPU Core #4",
			"Type": "Clock",
			"Value": 3900.00073,
			"Unit": "MHz"
		}, {
			"Name": "CPU Core #5",
			"Type": "Clock",
			"Value": 3900.00073,
			"Unit": "MHz"
		}, {
			"Name": "CPU Core #6",
			"Type": "Clock",
			"Value": 3900.00073,
			"Unit": "MHz"
		}, {
			"Name": "CPU Package",
			"Type": "Power",
			"Value": 15.735323,
			"Unit": "W"
		}, {
			"Name": "CPU Cores",
			"Type": "Power",
			"Value": 14.8387508,
			"Unit": "W"
		}, {
			"Name": "CPU Graphics",
			"Type": "Power",
			"Value": 0.04656077,
			"Unit": "W"
		}, {
			"Name": "CPU DRAM",
			"Type": "Power",
			"Value": 0.446761668,
			"Unit": "W"
		}, {
			"Name": "Bus Speed",
			"Type": "Clock",
			"Value": 100.000015,
			"Unit": "MHz"
		}],
		"WmiReport": null
	}, {
		"Name": "Generic Memory",
		"Type": "内存",
		"Sensors": [{
			"Name": "Memory",
			"Type": "Load",
			"Value": 28.5646687,
			"Unit": "%"
		}, {
			"Name": "Used Memory",
			"Type": "Data",
			"Value": 2.25409317,
			"Unit": "GB"
		}, {
			"Name": "Available Memory",
			"Type": "Data",
			"Value": 5.6371,
			"Unit": "GB"
		}],
		"WmiReport": null
	}, {
		"Name": "128GB SATA SSD",
		"Type": "硬盘",
		"Sensors": [{
			"Name": "Temperature",
			"Type": "Temperature",
			"Value": 31.0,
			"Unit": "°C"
		}, {
			"Name": "Used Space",
			"Type": "Load",
			"Value": 14.6201363,
			"Unit": "%"
		}],
		"WmiReport": "硬盘温度: 0°C\r\n硬盘温度: 1°C\r\n"
	}, {
		"Name": "ST1000VX012-3CU10C",
		"Type": "硬盘",
		"Sensors": [{
			"Name": "Temperature",
			"Type": "Temperature",
			"Value": 38.0,
			"Unit": "°C"
		}, {
			"Name": "Used Space",
			"Type": "Load",
			"Value": 0.06617792,
			"Unit": "%"
		}],
		"WmiReport": "硬盘温度: 0°C\r\n硬盘温度: 1°C\r\n"
	}],
	"ErrorMessage": null,
	"Success": true
}

下面是代码:

  1. 引用OpenHardwareMonitorLib.dll
  2. 调用
csharp 复制代码
	HardwareMonitor hardwareMonitor = new HardwareMonitor();
	HardwareMonitorModel hardwareMonitorModel = hardwareMonitor.GetHardwareInfo();
  1. 实现
csharp 复制代码
public class HardwareMonitor
{
    private Computer computer;

    public HardwareMonitor()
    {
        computer = new Computer
        {
            CPUEnabled = true,
            GPUEnabled = true,
            HDDEnabled = true,
            MainboardEnabled = true,
            RAMEnabled = true // 新增内存监控
        };
    }

    public HardwareMonitorModel GetHardwareInfo()
    {
        var model = new HardwareMonitorModel();

        try
        {
            computer.Open();

            // 多次更新以确保数据稳定
            for (int i = 0; i < 3; i++)
            {
                UpdateAllHardware();
                System.Threading.Thread.Sleep(100);
            }

            // 收集硬件信息
            foreach (var hardware in computer.Hardware)
            {
                var hardwareInfo = new HardwareInfo
                {
                    Name = hardware.Name,
                    Type = GetHardwareTypeString(hardware.HardwareType),
                    WmiReport = hardware.HardwareType == HardwareType.HDD ? GetHddWmiReport(hardware.Name) : null
                };

                // 处理主硬件传感器
                CollectSensors(hardware, hardwareInfo);

                // 处理子硬件传感器
                foreach (var subHardware in hardware.SubHardware)
                {
                    CollectSensors(subHardware, hardwareInfo);
                }

                // 特殊处理AMD GPU温度
                if (hardware.HardwareType == HardwareType.GpuAti)
                {
                    var amdGpuTemp = GetAmdGpuTemperature(hardware.Name);
                    if (amdGpuTemp.HasValue)
                    {
                        hardwareInfo.Sensors.Add(new SensorInfo
                        {
                            Name = "Temperature",
                            Type = "Temperature",
                            Value = amdGpuTemp.Value,
                            Unit = "°C"
                        });
                    }
                }

                model.HardwareList.Add(hardwareInfo);
            }

            model.Success = true;
        }
        catch (Exception ex)
        {
            model.ErrorMessage = $"获取硬件信息失败: {ex.Message}\n提示: 请确保以管理员权限运行程序";
            model.Success = false;
        }
        finally
        {
            computer.Close();
        }

        return model;
    }

    private void UpdateAllHardware()
    {
        foreach (var hardware in computer.Hardware)
        {
            hardware.Update();

            // 特殊处理硬盘
            if (hardware.HardwareType == HardwareType.HDD)
            {
                hardware.GetReport();
            }

            foreach (var subHardware in hardware.SubHardware)
            {
                subHardware.Update();
            }
        }
    }

    private void CollectSensors(IHardware hardware, HardwareInfo hardwareInfo)
    {
        foreach (var sensor in hardware.Sensors)
        {
            if (sensor.Value.HasValue)
            {
                hardwareInfo.Sensors.Add(new SensorInfo
                {
                    Name = sensor.Name,
                    Type = sensor.SensorType.ToString(),
                    Value = sensor.Value,
                    Unit = GetSensorUnit(sensor.SensorType)
                });
            }
        }
    }

    private float? GetAmdGpuTemperature(string gpuName)
    {
        try
        {
            using (var searcher = new ManagementObjectSearcher(@"root\AMD\GPU", "SELECT * FROM GPU_Thermal"))
            {
                foreach (var obj in searcher.Get())
                {
                    if (obj["DeviceName"].ToString().Contains(gpuName))
                    {
                        return Convert.ToSingle(obj["Temperature"]);
                    }
                }
            }
        }
        catch { }

        return null;
    }

    private string GetHddWmiReport(string hddName)
    {
        var report = new StringBuilder();

        try
        {
            using (var searcher = new ManagementObjectSearcher(@"root\WMI", "SELECT * FROM MSStorageDriver_FailurePredictData"))
            {
                foreach (var obj in searcher.Get())
                {
                    byte[] data = (byte[])obj["VendorSpecific"];
                    if (data != null && data.Length >= 10)
                    {
                        // SMART属性194通常是温度
                        byte temperature = data[10];
                        report.AppendLine($"硬盘温度: {temperature}°C");
                    }
                }
            }
        }
        catch { }

        return report.Length > 0 ? report.ToString() : null;
    }

    private string GetHardwareTypeString(HardwareType type)
    {
        switch (type)
        {
            case HardwareType.CPU: return "CPU";
            case HardwareType.GpuNvidia: return "NVIDIA GPU";
            case HardwareType.GpuAti: return "AMD GPU";
            case HardwareType.HDD: return "硬盘";
            case HardwareType.Mainboard: return "主板";
            case HardwareType.RAM: return "内存";
            default: return type.ToString();
        }
    }

    private string GetSensorUnit(SensorType type)
    {
        switch (type)
        {
            case SensorType.Temperature: return "°C";
            case SensorType.Fan: return "RPM";
            case SensorType.Voltage: return "V";
            case SensorType.Clock: return "MHz";
            case SensorType.Load:
            case SensorType.Control: return "%";
            case SensorType.Power: return "W";
            case SensorType.Data: return "GB";
            case SensorType.Factor: return "";
            default: return "";
        }
    }
}
  1. 使用到的Model对象
csharp 复制代码
	public class HardwareInfo
    {
        public string Name { get; set; }
        public string Type { get; set; }
        public List<SensorInfo> Sensors { get; set; }
        public string WmiReport { get; set; }

        public HardwareInfo()
        {
            Sensors = new List<SensorInfo>();
        }
    }
    
	public class HardwareMonitorModel
    {
        public List<HardwareInfo> HardwareList { get; set; }
        public string ErrorMessage { get; set; }
        public bool Success { get; set; }

        public HardwareMonitorModel()
        {
            HardwareList = new List<HardwareInfo>();
        }
    }
    
    public class SensorInfo
    {
        public string Name { get; set; }
        public string Type { get; set; }
        public float? Value { get; set; }
        public string Unit { get; set; }
    }
相关推荐
z落落2 分钟前
C# ArrayList 动态集合(接口/区别/API/深浅拷贝)+ List<T> 泛型集合
开发语言·c#
Cx330❀2 分钟前
【Linux网络】从零构建高性能UDP服务器:从Echo到英译汉业务级实现
大数据·linux·服务器·开发语言·网络·c++·udp
basketball6163 分钟前
Golang:基础语法总结
开发语言·后端·golang
兰令水4 分钟前
leecodecode【双指针题2】【2026.5.26打卡-java版本】
java·开发语言·算法
不吃土豆的马铃薯5 分钟前
TCP 三次握手 / 四次挥手详解
服务器·开发语言·网络·c++·网络协议·tcp/ip
ch.ju6 分钟前
Java程序设计(第3版)第四章——引用
java·开发语言
Huangjin007_10 分钟前
【C++ STL篇(十三)】无序关联容器 unordered_set / unordered_map解析
开发语言·c++
白日与明月10 分钟前
pip下载库指定操作系统及python版本
开发语言·python·pip
折哥的程序人生 · 物流技术专研11 分钟前
Qoder 1.0 完全指南:从安装到Agents驱动开发实战
开发语言·人工智能·python·ai编程
游乐码12 分钟前
unity基础(八)协程
游戏·unity·c#·游戏引擎