【问题标题】:How can I get the CPU temperature?如何获取 CPU 温度?
【发布时间】:2009-07-28 16:03:50
【问题描述】:

我需要为我正在开发的应用程序收集一些系统信息。使用 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;
    }
}

【问题讨论】:

  • 如果你愿意付钱,我会考虑 cpuid-pro.com,如果我没记错的话,它与 z-cpu 使用的是同一个库..

标签: c# .net wmi


【解决方案1】:

其他可能过来的朋友可以看看:http://openhardwaremonitor.org/

点击该链接,起初您可能会想,“嘿,这是一个应用程序,这就是它被删除的原因。问题是如何从 C# 代码中执行此操作,而不是找到一个可以告诉我温度的应用程序...”这表明您不愿意花足够的时间来阅读“打开硬件监视器”也是如此。

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

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

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

大部分情况下,如果不是 100% 的话,它只是 WinRing0 API 的一个包装器,如果您愿意,可以选择自己包装它。

我自己在一个 C# 应用程序中尝试过这个,它可以工作。虽然它仍处于测试阶段,但它看起来相当稳定。它也是开源的,所以它可能是一个很好的起点。

【讨论】:

  • 您能否链接任何有关使用 OpenHardware Lib 的文档?我似乎不知道如何在我的项目中使用它。
  • 不幸的是不是,我使用普通的旧“发现”来找到我需要的东西......但是你有什么问题?......它是非常基本的实例化“计算机”类然后从那里开始工作......(例如计算机 - > IHardware - > ISensors)或者从他们的SVN存储库下载源代码并尝试找出他们自己的GUI,我个人没有那么大的问题只是发现一些东西,但如果你错过了一些具体的东西,它可能是什么?
  • 通过弄清楚他们的 GUI,我的意思是作为灵感来源,让您了解如何访问各种不同的传感器等等......然后在您自己的项目中复制这种用法。跨度>
  • 这真的很有帮助。在这里找到的东西比我想要的要多得多。谢谢。
【解决方案2】:

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

为了获取摄氏温度,我创建了一个包装器,它将 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 temperature = Convert.ToDouble(obj["CurrentTemperature"].ToString());
                    temperature = (temperature - 2732) / 10.0;
                    result.Add(new Temperature { CurrentValue = temperature, InstanceName = obj["InstanceName"].ToString() });
                }
                return result;
            }
        }
    }
}

【讨论】:

  • 你读过这个问题吗? OP 说他已经尝试过 MSAcpi_ThermalZoneTemperature...
  • 这不是 CPU 温度,我认为是外壳温度。您可以使用 CPUID 进行检查。
  • Idk 该代码试图做什么,但我得到的值是 -267.8。
【解决方案3】:

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

如果您想为很多不同的主板执行此操作,我建议您联系 SiSoftware 之类的人或准备阅读大量主板手册。

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

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

【讨论】:

    【解决方案4】:

    您可以试试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
            }
        }
    }
    

    official source 下载 ZIP 文件,解压缩并在您的项目中添加对文件 OpenHardwareMonitorLib.dll 的引用。

    【讨论】:

      【解决方案5】:

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

      它还包括许多更新(例如对 RyzenXeon 的支持),因为在 Open Hardware Monitor (OHM) 上,他们自 2015 年以来未接受拉取请求。

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

      【讨论】:

      【解决方案6】:

      这取决于您的计算机是否支持 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();
                 }
             }
         }
      }
      

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

      您可以在 Using Open Hardware Monitor to get CPU temperature in C# and make a fan cooling system 中查看教程。

      【讨论】:

        【解决方案7】:

        它可以通过 WMI 在您的代码中完成。我从 Microsoft 找到了一个工具 (WMI Code Creator v1.0) 可以为其创建代码。

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

        【讨论】:

          【解决方案8】:

          在最新版本的 Windows 10 中,上述 WMI 类不适用于我。

          在我的戴尔笔记本电脑上,我可以通过 PowerShell 像这样以摄氏度获取 CPU 温度:

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

          【讨论】:

          • 底层接口是什么? COM? .NET?我想象除了 PowerShell 之外的许多其他语言。
          猜你喜欢
          • 2014-06-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多