如何获得CPU温度?

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

Win32_TemperatureProbe 

要么

 MSAcpi_ThermalZoneTemperature 

有没有人处理过这个问题? 我想知道如何监测程序,如SiSoftware桑德拉,可以得到这些信息…

以防有人感兴趣,下面是这个类的代码:

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

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

如果你想为很多不同的电路板做这个,我build议你与SiSoftware联系,或者准备阅读大量的主板手册。

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

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

对于可能来这里的其他人,也许看看: http : //openhardwaremonitor.org/

遵循这个链接,起初你可能会想,“嘿,这是一个应用程序,这就是为什么它被删除,问题是如何从C#代码做到这一点,而不是find一个应用程序,可以告诉我的温度…”这就表明你不愿意投入足够的时间来阅读“Open Hardware Monitor”。

他们还包括一个数据接口,这里是描述:

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

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

它主要是,如果不是100%,只是一个WinRing0 API的包装,你可以select包装自己,如果你觉得喜欢它。

我已经从C#应用程序本身尝试了这一点,它的工作原理。 虽然它还处于testing阶段,但看起来相当稳定。 它也是开源的,所以它可能是一个好的起点。

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

我知道这个post是旧的,但只是想添加一个评论,如果有人应该看这个post,并试图find这个问题的解决scheme。

您可以通过使用WMI方法在C#中非常容易地读取CPU温度。

为了得到一个摄氏温度值,我创build了一个包装器来转换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:

(刚刚看到一个链接发布到上面的同一种解决scheme…无论如何,我会离开这段代码,如果有人应该使用它:-))

有一个关于如何在这里做一些C#示例代码的博客文章。

它可以通过WMI在您的代码中完成。 我find了一个来自微软的工具,为它创build了代码。

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

你可以在这里下载。