CPU 温度监测

22
为了一个编程项目,我想访问我的CPU和GPU的温度读数。我将使用C#语言。从各种论坛中,我得到的印象是,你需要特定的信息和开发资源才能访问不同板块的这些信息。 我有一个MSI NF750-G55主板。MSI的网站上没有我要找的任何信息。我尝试了他们的技术支持,我跟那位代表谈过话后得知他们没有这样的信息。一定有办法获得这些信息。 有什么想法?

1
这里有一个不错的示例项目,位于http://geekswithblogs.net/cicorias/archive/2006/11/22/97855.aspx,可能会帮助您入门。直接链接到包含解决方案和所有源代码的zip文件:http://www.cicoria.com/downloads/TemperatureMonitor/TempMonitorSrc.zip - Chris Shouts
2
使用Justin Niessner的解决方案,很多人遇到了System.InvalidOperationException的问题。 为了避免这种情况,程序应该在管理员模式下运行。 - user2359527
3个回答

20

至少在处理 CPU 方面,您可以使用 WMI。

命名空间\对象是root\WMI, MSAcpi_ThermalZoneTemperature

示例代码:

ManagementObjectSearcher searcher = 
    new ManagementObjectSearcher("root\\WMI",
                                 "SELECT * FROM MSAcpi_ThermalZoneTemperature");

ManagementObjectCollection collection = 
    searcher.Get();

foreach(ManagementBaseObject tempObject in collection)
{
    Console.WriteLine(tempObject["CurrentTemperature"].ToString());
}

这将给你以原始格式的温度。你需要从那里进行转换:

kelvin = raw / 10;

celsius = (raw / 10) - 273.15;

fahrenheit = ((raw / 10) - 273.15) * 9 / 5 + 32;

@Aaron - 我是新手,正在努力实现这段代码。所以我们拭目以待 =]。 - Paul
1
我得到了一个ManagementException,enumerator.MoveNext()不支持,还有其他人遇到这个问题吗? - ist_lion
5
遗憾的是,大多数主板没有通过 WMI 实现此功能。在我的系统上也会出现异常。 - Shachar Weis
这有时候可以工作,但不会返回CPU或GPU温度阅读此处。我使用“有时候”这个词是因为要获取这个值,主板必须至少有一个热传感器。 - ST3
4
我只想指出MSAcpi_ThermalZoneTemperature不是CPU温度,而是主板某个区域的温度……这就像根据厨房的温度来测量炉子温度一样没有什么用处。 - Electric Coffee
显示剩余4条评论

2

在Windows上进行与硬件相关的编码的最佳方法是使用微软的 WMI 工具,这是一个来自微软的代码生成器工具,该工具将根据您所寻找的硬件相关数据和您想要使用的.Net语言为您创建代码。

目前支持的语言有:C#、Visual Basic和VB Script。


0
请注意,MSAcpi_ThermalZoneTemperature 并不会给出 CPU 的温度,而是主板的温度。此外,请注意大多数主板并未通过 WMI 实现此功能。
您可以尝试使用 Open Hardware Monitor,但它缺乏对最新处理器的支持。
internal sealed class CpuTemperatureReader : IDisposable
{
    private readonly Computer _computer;

    public CpuTemperatureReader()
    {
        _computer = new Computer { CPUEnabled = true };
        _computer.Open();
    }

    public IReadOnlyDictionary<string, float> GetTemperaturesInCelsius()
    {
        var coreAndTemperature = new Dictionary<string, float>();

        foreach (var hardware in _computer.Hardware)
        {
            hardware.Update(); //use hardware.Name to get CPU model
            foreach (var sensor in hardware.Sensors)
            {
                if (sensor.SensorType == SensorType.Temperature && sensor.Value.HasValue)
                    coreAndTemperature.Add(sensor.Name, sensor.Value.Value);
            }
        }

        return coreAndTemperature;
    }

    public void Dispose()
    {
        try
        {
            _computer.Close();
        }
        catch (Exception)
        {
            //ignore closing errors
        }
    }
}

官方来源下载zip文件,解压并在您的项目中添加对OpenHardwareMonitorLib.dll的引用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接