如何让CPU的温度?(How to get CPU temperature?)

2019-06-17 18:12发布

我需要收集一些系统对我开发的应用程序的信息。 可用内存和CPU负载很容易使用C#来获得。 不幸的是,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;
    }
}

Answer 1:

我敢肯定它的制造商依赖,因为他们将通过一个I / O端口进行访问。 如果你有一个特定的板你想一起工作,尽量翻翻手册和/或制造商联系。

如果您想为很多不同的板做到这一点,我建议你联系的人在类似SiSoftware公司或准备读取主板手册了很多。

作为另一个注意,不是所有的主板有温度监控。

您也可能会遇到越来越从内核访问特权的问题。



Answer 2:

对于其他人谁可能会通过这里,也许看一看: http://openhardwaremonitor.org/

按照该链接,一开始你可能会想,“嘿,这是一个应用程序,这就是为什么它被删除,但问题是如何从C#代码做到这一点,没有找到一个应用程序,可以告诉我下......”这是它表明你是不是愿意读什么“开放的硬件监控”投入足够的时间也是。

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

数据接口开放硬件监控发布所有传感器数据WMI(Windows管理规范)。 这将允许其他应用程序来读取和使用传感器的信息,以及。 接口的初步文件,可以发现这里(点击) 。

当你下载它,它包含了OpenHardwareMonitor.exe应用程序,你不找一个。 它还包含OpenHardwareMonitorLib.dll,你要找的那一个。

这主要是,如果不是100%,就在WinRing0 API,你可以选择,如果你喜欢它的感觉来包装你的自我包装。

我已经从C#尝试了这一点,应用程式自己,和它的作品。 尽管仍处于测试阶段,它似乎相当稳定。 这也是开源的所以它可能是一个很好的起点,而不是。

在一天结束时,我很难相信这是不是在这个问题上的话题。



Answer 3:

我知道这个帖子是老了,但只是想添加评论,如果有人应该看看这篇文章,试图找到一个解决这个问题。

你的确可以通过使用WMI的做法很容易读取CPU温度在C#。

要获得摄氏温度值,我已经创建了一个转换由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;

            }
        }
    }
}

更新25.06.2010:

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



Answer 4:

有一个博客张贴关于如何做到这一点一些C#示例代码在这里 。



Answer 5:

这取决于您的计算机是否支持WMI 。 我的电脑不能太运行此WMI演示。

但是,我顺利拿到通过开放式硬件监控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



Answer 6:

我提取的CPU部分从打开硬件监控成分离的文库,露出传感器和部件通常隐藏到OHM。 它还包含了许多更新(像Ryzen和Xeon)的支持,因为在OHM他们不自2015年接受引入请求。

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

让我们知道你的意见:)



Answer 7:

它可以通过WMI代码来完成。 我发现微软的工具,为其创建的代码。

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

您可以下载它在这里 。



Answer 8:

你可以给打开硬件监控一去,虽然它缺乏最新的处理器的支持。

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

请从拉链的官方消息 ,提取物和你的项目添加到OpenHardwareMonitorLib.dll参考。



文章来源: How to get CPU temperature?
标签: c# .net wmi