如何获得CPU温度?每个核心分开

时间:2014-06-19 07:51:45

标签: c# asp.net wmi

我使用此代码来获取cpu温度,但我得不到支持'而不是温度。

public static string getCpuTemperature()
{
    try
    {

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

        foreach (ManagementObject queryObj in searcher.Get())
        {
            double temp = Convert.ToDouble(queryObj["CurrentTemperature"].ToString());
            double temp_critical = Convert.ToDouble(queryObj["CriticalTripPoint"].ToString());
            double temp_cel = (temp / 10 - 273.15);
            double temp_critical_cel = temp_critical / 10 - 273.15;
            return temp_cel.ToString() + " _ " + temp_critical_cel.ToString();
        }
    }
    catch (ManagementException e)
    {
        //MessageBox.Show("An error occurred while querying for WMI data: " + e.Message);
        return e.Message.ToString();
    }
    return "";
}

我已经搜索了这个问题并且已经看到了很多答案,包括 - 主板不支持此功能 - 运行VS与管理权 等...

但它们都不是真的,因为像 OpenHardwareMonitor SpeedFan 这样的程序会显示cpu和gpu的温度,Hdd温度,cpu风扇速度以及所有其他信息。

我想知道他们是怎么做到的?我得到了怎样的不被支持'消息和这些程序没有。

4 个答案:

答案 0 :(得分:3)

这不是一个完整的答案,但希望它有所帮助。

仔细阅读https://code.google.com/p/open-hardware-monitor/source/browse/trunk/处的代码后,如果不下载所有代码并进一步调查,我无法完全理解此代码。

魔术似乎发生在这里,

public override void Update() {
  base.Update();

  for (int i = 0; i < coreTemperatures.Length; i++) {
    uint eax, edx;
    // if reading is valid
    if (Ring0.RdmsrTx(IA32_THERM_STATUS_MSR, out eax, out edx,
        1UL << cpuid[i][0].Thread) && (eax & 0x80000000) != 0) 
    {
      // get the dist from tjMax from bits 22:16
      float deltaT = ((eax & 0x007F0000) >> 16);
      float tjMax = coreTemperatures[i].Parameters[0].Value;
      float tSlope = coreTemperatures[i].Parameters[1].Value;
      coreTemperatures[i].Value = tjMax - tSlope * deltaT;
    } else {
      coreTemperatures[i].Value = null;
    }
  }

  ...

此代码从Ring0.RdmsrTx的结果中提取温度数据。

我相信Ring0是环形缓冲区的C实现,其代码位于存储库here中。这将从CPU驱动程序中读取 M odel S 特定 R egister数据。

this question中有更详细的内容。

答案 1 :(得分:1)

最简单的方法可能是找到一种工具,它可以以机器可读的方式输出您需要的信息,然后处理该输出。 SpeedFan将温度记录到日志中,您可以从日志中读取最新的读数。

我意识到这可能不是一个理想的解决方案,但它是唯一的通用解决方案。在Windows系统中查询CPU温度并非易事。

答案 2 :(得分:0)

许多计算机不支持WMI,运行代码时会显示错误。但我可以通过openhardwaremonitor获得CPU温度。 这是代码

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

答案 3 :(得分:0)

我回答这个问题可能很晚了,但是以防万一将来有人偶然发现这个问题,这就是我的做法:

public string getCPUTemp()
        {
            UpdateVisitor updateVisitor = new UpdateVisitor();
            Computer computer = new Computer();
            computer.Open();
            computer.CPUEnabled = true;
            computer.Accept(updateVisitor);
            string res = "";
            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) res = String.Concat(res, (computer.Hardware[i].Sensors[j].Name + ": " + computer.Hardware[i].Sensors[j].Value.ToString() + "ºC" + "\r"));
                        if (computer.Hardware[i].Sensors[j].Value.ToString() == "") { res = ""; return res; }
                    }

                }
            }

它对我来说效果很好(即使它不适用于GPU部件)。您只需要下载OpenHardwareMonitor(https://openhardwaremonitor.org/),然后将对OpenHardwareMonitorLib.dll的引用添加到\ openhardwaremonitor \ Bin \ Debug文件夹中,然后添加“ using OpenHardwareMonitor.Hardware;”。在顶部。

希望即使没有OP,它仍然可以帮助某人!