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

为什么 OpenHardwareMonitorLib 是唯一可行选项

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

关键事实如下:

如何正确引用并初始化 OpenHardwareMonitorLib

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

一个最小初始化示例:

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,程序大概率会崩溃。

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

下面是一个取首个有效 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?大概率是下面这几种情况之一:

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

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