商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > C#怎么读取电脑硬件CPU温度与风扇转速_C#调用OpenHardwareLib【实战】

C#怎么读取电脑硬件CPU温度与风扇转速_C#调用OpenHardwareLib【实战】

  发布于2026-07-18 阅读(0)

扫一扫,手机访问

直接告诉你答案:不能。 Windows 系统本身并不暴露 CPU 温度和风扇转速这些传感器数据,C# 也没有内置的 API 可以直接调用。想要读取这些硬件信息,必须依赖第三方硬件监控库。而在所有开源、免安装、支持 .NET Standard 的选项中,OpenHardwareMonitorLib(注意不是 OpenHardwareLib)是当下唯一稳定、可靠的选择。

为什么 OpenHardwareMonitorLib 是唯一可行选项

首先要澄清一个常见的混淆:市面上所谓的“OpenHardwareLib”其实并不存在,这个说法多半是旧博客写错了。真正能用的库是 OpenHardwareMonitorLib.dll,来自 Open Hardware Monitor 项目。它的工作原理很简单直接——通过访问 SMBus/ISA 总线、ACPI 表和 MSR 寄存器来获取传感器数值,从而绕开厂商驱动的限制。

关键事实如下:

  • 不依赖 WMI:Win32_TemperatureProbe 在绝大多数现代主板上返回的都是空值或无效值
  • 不依赖厂商 SDK:你不需要安装 ASUS AI Suite、MSI Dragon Center 这类臃肿的软件
  • 支持 .NET 5+ 和 .NET Framework 4.7.2+,但 net461 是最低兼容版本
  • 必须以管理员权限运行,否则多数传感器读数会显示为 0 或 NaN

如何正确引用并初始化 OpenHardwareMonitorLib

在 NuGet 里搜“OpenHardwareLib”是找不到的,从非官方源下载 DLL 也不靠谱。正确的做法是:

  • 前往 GitHub Release 页面,下载最新版 ZIP(比如 openhardwaremonitor-v0.9.6.zip
  • 解压后,从 /OpenHardwareMonitor/ 目录提取 OpenHardwareMonitorLib.dll(注意不是同名 EXE)
  • 在 Visual Studio 中右键项目 → “添加引用” → 浏览到该 DLL → 勾选“复制本地”设为 True
  • 代码中必须调用 computer.Open(),否则所有传感器都是 null

一个最小初始化示例:

using OpenHardwareMonitor.Hardware;

var computer = new Computer
{
    CPUEnabled = true,
    GPUEnabled = false,
    FanControllerEnabled = true,
    MainboardEnabled = true
};
computer.Open(); // ⚠️ 这行漏掉就全为 0

怎么安全读取 CPU 温度与风扇 RPM(带防崩溃处理)

传感器的结构是树状嵌套的:主硬件(CPU)→ 子传感器(温度、负载、风扇)。而且不同主板的传感器命名、数量、索引位置完全不一致。如果直接硬写 hardware.Sensors[2].Value,程序大概率会崩溃。

正确的做法是:遍历 + 类型 + 名称双重过滤。

  • 温度传感器类型为 SensorType.Temperature,名称通常含 "CPU""Core"(不一定都叫 "CPU Package")
  • 风扇传感器类型为 SensorType.Fan,名称通常含 "Fan""PWM" 或具体接口名如 "CPU_FAN"
  • 务必检查 sensor.Value.HasValue,未就绪时返回 null
  • 读取完后建议调用 computer.Hardware[i].Update() 刷新一次,否则值可能滞后

下面是一个取首个有效 CPU 温度和风扇的示例片段:

foreach (var hardware in computer.Hardware)
{
    hardware.Update();
    foreach (var sensor in hardware.Sensors)
    {
        if (sensor.SensorType == SensorType.Temperature && 
            (sensor.Name.Contains("CPU") || sensor.Name.Contains("Core")))
        {
            if (sensor.Value.HasValue)
                Console.WriteLine($"CPU temp: {sensor.Value.Value:F1}°C");
        }
        else if (sensor.SensorType == SensorType.Fan && 
                 sensor.Name.Contains("Fan"))
        {
            if (sensor.Value.HasValue)
                Console.WriteLine($"Fan RPM: {sensor.Value.Value:F0}");
        }
    }
}

常见报错与静默失败原因

程序没报错,但输出全是 0 / NaN / null?大概率是下面这几种情况之一:

  • Access is denied 异常没捕获 → 确保以管理员身份运行(右键 exe → “以管理员身份运行”)
  • 主板不支持:部分 ITX 小板、OEM 品牌机(比如 Dell 或 Lenovo 的台式机)、AMD AM5 新平台可能没有完整支持 → 查看 computer.Hardware 是否为空数组
  • BIOS 关闭了硬件监控:进入 BIOS,打开 HW MonitorQ-Fan ControlAdvanced → CPU Configuration → DTS/PECI 等选项
  • .NET 版本不匹配:如果用 .NET 6+,需要确认引用的 DLL 是从 v0.9.6+ 编译的,旧版只支持 net461
  • 多线程并发读取:computer.Open()Update() 不是线程安全的,要避免多个 Task 同时调用

有一点最容易被忽略:即使所有配置都正确,首次读取前必须等待 1–2 秒。传感器枚举和初始化不是即时完成的,立刻遍历往往拿到空值。

本文转载于:https://www.php.cn/faq/2344067.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注