asp.net 如何获取CPU温度?每个芯分别

hyrbngr7  于 2023-06-25  发布在  .NET
关注(0)|答案(3)|浏览(163)

我用这段代码来获取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与管理权等...
但是没有一个是正确的,因为像 OpenHardwareMonitorSpeedFan 这样的程序显示cpu和gpu的温度,硬盘温度,cpu风扇速度,以及所有其他信息。
我想知道他们是怎么做到的?为什么我收到“不支持”消息而这些程序没有?

2jcobegt

2jcobegt1#

这不是一个完整的答案,但希望能有所帮助。
在仔细阅读了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实现,其代码在这里的存储库中。这将从CPU驱动程序中读取M模型S特定R注册表数据。
this question中有更多细节。

fjaof16o

fjaof16o2#

最简单的方法可能是找到一个工具,可以以机器可读的方式输出所需的信息,然后处理输出。SpeedFan将温度记录到日志中,您可以从日志中读取最新阅读。
我知道这可能不是一个理想的解决方案,但它是唯一的普遍性。在Windows系统中查询CPU温度不是一件容易的事情。

vohkndzv

vohkndzv3#

我可能很晚才回答这个问题,但以防将来有人偶然发现这个问题,我是这样做的:

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/),然后添加到\openhardwareMonitor\Bin\Debug文件夹中的OpenHardwareMonitorLib.dll的引用,然后添加“using OpenHardwareMonitor.Hardware;“在顶部。
希望它仍然可以帮助别人,即使不OP!

相关问题