如何获得CPU温度?

yey*_*man 55 .net c# wmi

我需要为我正在开发的应用程序收集一些系统信息.使用C#可以轻松获得可用内存和CPU负载.不幸的是,CPU温度并不那么容易.我尝试过使用WMI但是我无法使用任何东西

Win32_TemperatureProbe
Run Code Online (Sandbox Code Playgroud)

要么

MSAcpi_ThermalZoneTemperature
Run Code Online (Sandbox Code Playgroud)

有人已经处理过这个问题吗?我想知道像SiSoftware Sandra这样的监控程序如何获取这些信息......

如果有人感兴趣,这里是该类的代码:

public class SystemInformation
{
    private System.Diagnostics.PerformanceCounter m_memoryCounter;
    private System.Diagnostics.PerformanceCounter m_CPUCounter;

    public SystemInformation()
    {
        m_memoryCounter = new System.Diagnostics.PerformanceCounter();
        m_memoryCounter.CategoryName = "Memory";
        m_memoryCounter.CounterName = "Available MBytes";

        m_CPUCounter = new System.Diagnostics.PerformanceCounter();
        m_CPUCounter.CategoryName = "Processor";
        m_CPUCounter.CounterName = "% Processor Time";
        m_CPUCounter.InstanceName = "_Total"; 
    }

    public float GetAvailableMemory()
    {
        return m_memoryCounter.NextValue();
    }

    public float GetCPULoad()
    {
        return m_CPUCounter.NextValue();
    }

    public float GetCPUTemperature()
    {
        //...
        return 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

Jen*_*ens 56

对于可能来到这里的其他人,请查看:http://openhardwaremonitor.org/

请关注该链接,首先您可能会想,"嘿,这是一个应用程序,这就是它被删除的原因,问题是如何从C#代码执行此操作,而不是找到可以告诉我温度的应用程序......"它表明你不愿意花足够的时间阅读"开放式硬件监视器".

它们还包括一个数据接口,这里是描述:

数据接口 Open Hardware Monitor将所有传感器数据发布到WMI(Windows Management Instrumentation).这允许其他应用程序也读取和使用传感器信息.可以在此处找到界面的初步文档(单击).

当你下载它时,它包含OpenHardwareMonitor.exe应用程序,你不是在寻找那个.它还包含OpenHardwareMonitorLib.dll,您正在寻找那个.

它主要是,如果不是100%,只是围绕WinRing0 API的包装器,如果你愿意,你可以选择包装自己.

我自己从C#应用程序尝试了这个,它的工作原理.尽管它仍处于测试阶段,但似乎相当稳定.它也是开源的,所以它可能是一个很好的起点.

在一天结束时,我发现很难相信这不是这个问题的主题.


小智 31

我知道这篇文章很老,但只是想添加评论,如果有人应该看这篇文章并试图找到解决这个问题的方法.

您确实可以使用WMI方法在C#中轻松读取CPU温度.

为了获得Celsius值,我创建了一个包装器,它可以转换WMI返回的值并将其包装成一个易于使用的对象.

请记住System.Management.dll在Visual Studio中添加对引用的引用.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Management;

namespace RCoding.Common.Diagnostics.SystemInfo
{
    public class Temperature
    {
        public double CurrentValue { get; set; }
        public string InstanceName { get; set; }
        public static List<Temperature> Temperatures
        {
            get
            {
                List<Temperature> result = new List<Temperature>();
                ManagementObjectSearcher searcher = new ManagementObjectSearcher(@"root\WMI", "SELECT * FROM MSAcpi_ThermalZoneTemperature");
                foreach (ManagementObject obj in searcher.Get())
                {
                    Double temp = Convert.ToDouble(obj["CurrentTemperature"].ToString());
                    temp = (temp - 2732) / 10.0;
                    result.Add(new Temperature { CurrentValue = temp, InstanceName = obj["InstanceName"].ToString() });
                }
                return result;

            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

2010年6月25日更新:

(只是看到一个链接被发布到上面的相同类型的解决方案......无论如何,如果有人想要使用它,我会留下这段代码:-))

  • 你读过这个问题吗?OP说他已经尝试过MSAcpi_ThermalZoneTemperature ...... (7认同)

sam*_*moz 19

我很确定它是制造商依赖的,因为它们将通过I/O端口访问.如果您正在尝试使用特定的电路板,请尝试查看手册和/或联系制造商.

如果你想为很多不同的主板做这件事,我建议你联系某人,比如SiSoftware,或者准备阅读很多主板手册.

另外注意,并非所有电路板都有温度监控器.

您也可能遇到从内核获得特权访问的问题.


Ali*_*hid 8

您可以试试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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

官方源下载 ZIP 文件,提取并添加对项目中文件OpenHardwareMonitorLib.dll的引用。


The*_*ult 6

我将 Open Hardware Monitor 中的 CPU 部分提取到一个单独的库中,暴露了通常隐藏在 OHM 中的传感器和成员。

它还包括许多更新(例如对RyzenXeon的支持),因为在开放硬件监视器(OHM)上,他们自 2015 年以来就没有接受拉取请求。

https://www.nuget.org/packages/HardwareProviders.CPU.Standard/