如何使用c#从bios获取cpu温度信息?

8
如何使用c#从Bios获取CPU温度信息 我尝试了在CPU temperature monitoring中的代码,但没有成功。'enumerator.Current'抛出了异常。 我该怎么做才能实现这个功能呢?谢谢。 错误: "This system doesn't support the required WMI objects(1) - check the exception file \r\nNot supported\r\n\r\n at System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStatus errorCode)\r\n at System.Management.ManagementObjectCollection.ManagementObjectEnumerator.MoveNext()\r\n at CedarLogic.WmiLib.SystemStatistics.RefreshReadings() in D:\Downloads\TempMonitorSrc\TemperatureMonitorSln\WmiLib\SystemStatistics.cs:line 25\r\n at CedarLogic.WmiLib.SystemStatistics.get_CurrentTemperature() in D:\Downloads\TempMonitorSrc\TemperatureMonitorSln\WmiLib\SystemStatistics.cs:line 87\r\n at TemperatureMonitor.SystemTrayService.CheckSupport() in D:\Downloads\TempMonitorSrc\TemperatureMonitorSln\TemperatureMonitor\SystemTrayService.cs:line 260"

2
你需要从主板制造商那里获取一个改进的WMI提供程序。不要指望能得到一个。 - Hans Passant
1
是的,我明白。我只是提到那个工具,这样你就可以看到可用的WMI对象。根据你使用的Windows版本,对象的名称可能已更改。 - linuxuser27
1
没有实例意味着你很不走运。不幸的是,'Hans Passant' 是正确的。如果没有相关类的实例,或者你无法找到能提供这些信息的对象,你将需要从制造商获取一个 WMI 提供程序。 - linuxuser27
1
这不是驱动程序问题。它是使用底层驱动程序的WMI组件。您可能已安装了此组件的驱动程序,但似乎没有支持该驱动程序的WMI组件。WMI只是系统管理的抽象。 - linuxuser27
1
我真的不知道。我相信还有其他机制,但我不知道它们是什么。还有其他的WMI对象可以提供关于温度的信息。这些类可以在root\CIMV2下的CIM_ManagedSystemElement\CIM_LogicalElement\CIM_LogicalDevice中找到。这些类包含了很多信息,不仅仅是温度。你可能会在那里找到你要找的东西。祝你好运。 - linuxuser27
显示剩余6条评论
3个回答

2

您需要支持许多不同的硬件传感器来收集温度数据。更好的方法是采用现成的解决方案,例如:

1)Open Hardware Monitor - 开源.NET 2.0 应用程序:

http://openhardwaremonitor.org/

2)Core Temp - 免费应用程序和.NET API 以获取温度数据:

http://www.alcpu.com/CoreTemp/developers.html


1

我知道这个帖子很旧了,但我想用一种不同的方式来补充它。获取主板上I/O芯片的制造商/型号,并获取该I/O芯片的数据手册(我将在这里使用ITE IT8783F芯片作为参考)。 查找类似于"Environment Controller"的内容并计算访问和读取端口。是的...您需要了解HEX、MSB和LSB,而我不会在这里进行计算/说明(超出范围)。 现在,在这种情况下,访问端口是295,读取端口是296。在该部分继续向下阅读,有一个环境控制器寄存器的表格。在这种情况下,CPU温度位于2Ah寄存器(或0x2A)中。因此,我用于提取信息的VB/C#代码如下:

Private Function GetCPUTemp() As UInt32
    Dim tCpu As UInt32
    Dim stCpu As Short
    PortAccess.Outputb(&H295, &H2A)
    stCpu = PortAccess.Inputb(&H296)
    tCpu = CType(stCpu, UInt32)
    Return tCpu
End Function

现在,你只需要弄清楚你想用它做什么。记住,如果你发现得到了一些奇怪的数字,那么你可能是从错误的寄存器中读取或者你可能需要实现一个缩放因子(就像电压读数一样)。这个也应该在数据表中有说明。

这里有一份来自英特尔的相关文档,关于2010年9月的DTS/PECI CPU监测,http://download.intel.com/design/intarch/papers/322683.pdf,其中包含了一些有关解读英特尔处理器温度数据的信息。 - Richard Chambers

0
我建议采用以下方法。有几个免费的应用程序可以监控CPU温度并显示它。尝试下载一些应用程序,然后分析它们,看看它们调用了哪些方法以便发现它们是如何工作的。也许它们有一个非常不同的方法来解决你现有的问题。此外,你也可以通过电子邮件联系他们并询问他们是如何做到的...

http://www.alcpu.com/CoreTemp/

http://www.techpowerup.com/realtemp/

http://malektips.com/core-temp-cpu-windows-system-tray-taskbar.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接