如何获得CPU温度?

时间:2009-07-28 16:03:50

标签: c# .net wmi

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

Win32_TemperatureProbe

MSAcpi_ThermalZoneTemperature

有人已经处理过这个问题吗?我想知道像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;
    }
}

9 个答案:

答案 0 :(得分:53)

  

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

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

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

  

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

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

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

我自己从C#应用程序中试过这个,但它确实有效。尽管它仍处于测试阶段,但似乎相当稳定。它也是开源的,所以它可能是一个很好的起点。

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

答案 1 :(得分:31)

我知道这篇文章已经过时了,但是如果有人应该查看这篇文章并试图找到解决此问题的方法,那么只是想添加评论。

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

要获得Celsius值,我创建了一个包装器,它将WMI返回的值转换为易于使用的对象。

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

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;

            }
        }
    }
}

更新25.06.2010:

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

答案 2 :(得分:20)

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

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

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

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

答案 3 :(得分:3)

有一篇博客文章,其中包含一些关于如何操作的C#示例代码here

答案 4 :(得分:2)

这取决于您的计算机是否支持WMI。我的电脑也无法运行此WMI演示。

但是我通过Open Hardware Monitor成功获得了CPU温度。在Visual Studio中添加Openhardwaremonitor引用。这比较容易。试试这个

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenHardwareMonitor.Hardware;
namespace Get_CPU_Temp5
{
   class Program
   {
       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) { }
       }
       static void GetSystemInfo()
       {
           UpdateVisitor updateVisitor = new UpdateVisitor();
           Computer computer = new Computer();
           computer.Open();
           computer.CPUEnabled = true;
           computer.Accept(updateVisitor);
           for (int i = 0; i < computer.Hardware.Length; i++)
           {
               if (computer.Hardware[i].HardwareType == HardwareType.CPU)
               {
                   for (int j = 0; j < computer.Hardware[i].Sensors.Length; j++)
                   {
                       if (computer.Hardware[i].Sensors[j].SensorType == SensorType.Temperature)
                               Console.WriteLine(computer.Hardware[i].Sensors[j].Name + ":" + computer.Hardware[i].Sensors[j].Value.ToString() + "\r");
                   }
               }
           }
           computer.Close();
       }
       static void Main(string[] args)
       {
           while (true)
           {
               GetSystemInfo();
           }
       }
   }
}

您需要以管理员身份运行此演示。

您可以在此处查看教程: http://www.lattepanda.com/topic-f11t3004.html

答案 5 :(得分:2)

我将CPU部件从Open Hardware Monitor中提取到一个独立的库中,将通常隐藏在OHM中的传感器和成员暴露出来。 它还包括许多更新(例如对Ryzen和Xeon的支持),因为在OHM上他们自2015年以来不接受拉取请求。

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

让我们知道你的意见:)

答案 6 :(得分:1)

可以通过WMI在您的代码中完成。我找到了一个Microsoft的工具,可以为它创建代码。

  

WMI Code Creator工具允许您生成VBScript,C#和VB   使用WMI完成管理任务(如查询)的.NET代码   用于管理数据,从WMI类执行方法或接收   使用WMI的事件通知。

您可以下载here

答案 7 :(得分:1)

尽管它不支持最新的处理器,但您可以试用开放式硬件监视器。

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
        }
    }
}

official source下载zip,提取并在项目中添加对OpenHardwareMonitorLib.dll的引用。

答案 8 :(得分:1)

提到的 WMI 类在最新版本的 Windows 10 中对我不起作用。

在我的戴尔笔记本电脑上,我可以像这样通过 PowerShell 获得 CPU 温度(以摄氏度为单位):

$data = Get-WMIObject -Query "SELECT * FROM Win32_PerfFormattedData_Counters_ThermalZoneInformation" -Namespace "root/CIMV2"
@($data)[0].HighPrecisionTemperature