C# 读取硬件温度完整指南

以下是在C#中读取CPU、硬盘和内存温度的完整解决方案,包含多种实现方式。

图片[1]_C# 读取硬件温度完整指南_知途无界

1. 使用WMI (Windows Management Instrumentation)

这是最通用的方法,适用于大多数Windows系统。

using System;
using System.Management;

public class HardwareMonitor
{
    public static void GetHardwareTemperatures()
    {
        try
        {
            // CPU温度
            Console.WriteLine("CPU温度:");
            GetCpuTemperature();

            // 硬盘温度
            Console.WriteLine("\n硬盘温度:");
            GetHddTemperature();

            // 内存温度(通常不可用)
            Console.WriteLine("\n内存温度:");
            GetMemoryTemperature();
        }
        catch (Exception ex)
        {
            Console.WriteLine($"错误: {ex.Message}");
        }
    }

    private static void GetCpuTemperature()
    {
        ManagementObjectSearcher searcher = new ManagementObjectSearcher(
            @"root\WMI", 
            "SELECT * FROM MSAcpi_ThermalZoneTemperature");

        foreach (ManagementObject obj in searcher.Get())
        {
            double tempKelvin = Convert.ToDouble(obj["CurrentTemperature"].ToString());
            double tempCelsius = (tempKelvin - 2732) / 10.0;
            Console.WriteLine($"CPU核心温度: {tempCelsius}°C");
        }
    }

    private static void GetHddTemperature()
    {
        ManagementObjectSearcher searcher = new ManagementObjectSearcher(
            @"root\WMI", 
            "SELECT * FROM MSStorageDriver_ATAPISmartData");

        foreach (ManagementObject obj in searcher.Get())
        {
            byte[] bytes = (byte[])obj["VendorSpecific"];
            for (int i = 0; i < bytes.Length; i += 12)
            {
                if (bytes[i + 1] == 0xC2 && bytes[i + 3] == 0x00)
                {
                    int temp = bytes[i + 5];
                    Console.WriteLine($"硬盘温度: {temp}°C");
                    break;
                }
            }
        }
    }

    private static void GetMemoryTemperature()
    {
        // 内存温度通常不可通过WMI获取
        Console.WriteLine("内存温度信息不可用");
    }
}

2. 使用Open Hardware Monitor库

需要先安装OpenHardwareMonitorLib.dll

using OpenHardwareMonitor.Hardware;
using System;
using System.Threading;

public class OpenHardwareMonitor
{
    public static void Monitor()
    {
        Computer computer = new Computer
        {
            CPUEnabled = true,
            GPUEnabled = true,
            HDDEnabled = true,
            RAMEnabled = true,
            MainboardEnabled = true
        };

        computer.Open();

        while (true)
        {
            computer.Accept(new UpdateVisitor());

            foreach (IHardware hardware in computer.Hardware)
            {
                Console.WriteLine($"硬件: {hardware.Name}");
                hardware.Update();

                foreach (ISensor sensor in hardware.Sensors)
                {
                    if (sensor.SensorType == SensorType.Temperature)
                    {
                        Console.WriteLine($"  {sensor.Name}: {sensor.Value}°C");
                    }
                }
            }

            Thread.Sleep(1000);
            Console.Clear();
        }
    }
}

public class UpdateVisitor : IVisitor
{
    public void VisitComputer(IComputer computer)
    {
        computer.Traverse(this);
    }

    public void VisitHardware(IHardware hardware)
    {
        hardware.Update();
        foreach (IHardware subHardware in hardware.SubHardware)
            subHardware.Accept(this);
    }

    public void VisitSensor(ISensor sensor) { }
    public void VisitParameter(IParameter parameter) { }
}

3. 使用LibreHardwareMonitor库

更现代的替代方案,需要安装LibreHardwareMonitorLib.dll

using LibreHardwareMonitor.Hardware;
using System;
using System.Threading;

public class LibreHardwareMonitor
{
    public static void Monitor()
    {
        Computer computer = new Computer
        {
            IsCpuEnabled = true,
            IsGpuEnabled = true,
            IsMemoryEnabled = true,
            IsStorageEnabled = true
        };

        computer.Open();

        while (true)
        {
            foreach (IHardware hardware in computer.Hardware)
            {
                hardware.Update();
                Console.WriteLine($"硬件: {hardware.Name} ({hardware.HardwareType})");

                foreach (ISensor sensor in hardware.Sensors)
                {
                    if (sensor.SensorType == SensorType.Temperature && sensor.Value.HasValue)
                    {
                        Console.WriteLine($"  {sensor.Name}: {sensor.Value}°C");
                    }
                }
            }

            Thread.Sleep(1000);
            Console.Clear();
        }
    }
}

4. 注意事项

  1. 权限问题
  • 需要以管理员权限运行程序
  • 某些防病毒软件可能会阻止访问
  1. 兼容性问题
  • 不同硬件厂商的实现可能不同
  • 某些传感器可能无法被检测到
  1. 性能考虑
  • 频繁查询(如每秒多次)可能影响系统性能
  • 考虑添加适当的延迟
  1. 错误处理
  • 始终添加try-catch块处理异常
  • 检查返回值是否为null
  1. 替代方案
  • 对于游戏开发等场景,可以考虑使用厂商SDK(如NVIDIA NVAPI)
  • 企业环境可以考虑使用SNMP协议

5. 完整示例程序

using System;
using System.Management;

class Program
{
    static void Main()
    {
        Console.WriteLine("硬件温度监控");
        Console.WriteLine("1. WMI方法");
        Console.WriteLine("2. OpenHardwareMonitor方法");
        Console.Write("选择方法: ");

        var choice = Console.ReadLine();

        switch(choice)
        {
            case "1":
                HardwareMonitor.GetHardwareTemperatures();
                break;
            case "2":
                OpenHardwareMonitor.Monitor();
                break;
            default:
                Console.WriteLine("无效选择");
                break;
        }

        Console.WriteLine("按任意键退出...");
        Console.ReadKey();
    }
}

以上代码提供了多种方法来获取硬件温度信息,您可以根据具体需求选择最适合的方案。对于生产环境,建议使用LibreHardwareMonitor库,它提供了最全面和稳定的硬件监控功能。

© 版权声明
THE END
喜欢就点个赞,支持一下吧!
点赞53 分享
评论 抢沙发
头像
欢迎您留下评论!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容