我需要为我正在开发的应用程序收集一些系统信息。使用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;
}
}
答案 0 :(得分:53)
对于可能来到这里的其他人,请查看:http://openhardwaremonitor.org/
关注该链接,首先你可能会想,“嘿,这是一个应用程序,这就是为什么它被删除,问题是如何从C#代码执行此操作,而不是找到一个可以告诉我温度的应用程序.. “这表明你不愿意投入足够的时间阅读”开放硬件监视器“。
它们还包括数据接口,这里是描述:
数据接口 Open Hardware Monitor将所有传感器数据发布到 WMI(Windows Management Instrumentation)。这允许其他 应用程序也可以读取和使用传感器信息。一个 可以找到界面的初步文档here(click)。
当你下载它时,它包含OpenHardwareMonitor.exe应用程序,你不是在寻找那个。它还包含OpenHardwareMonitorLib.dll,您正在寻找那个。
主要是,如果不是100%,只是围绕WinRing0 API的包装器,如果你愿意,你可以选择包装自己。
我自己从C#应用程序中试过这个,但它确实有效。尽管它仍处于测试阶段,但似乎相当稳定。它也是开源的,所以它可能是一个很好的起点。
在一天结束时,我发现很难相信这不是关于这个问题的主题。
答案 1 :(得分:31)
我知道这篇文章已经过时了,但是如果有人应该查看这篇文章并试图找到解决此问题的方法,那么只是想添加评论。
您确实可以使用WMI方法在C#中轻松读取CPU温度。
要获得Celsius值,我创建了一个包装器,它将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:
(刚刚看到一个链接被发布到上面的同类解决方案...... 无论如何,如果有人想要使用它,我会留下这段代码:-))
答案 2 :(得分:20)
我很确定它是制造商依赖的,因为它们将通过I / O端口访问。如果您正在尝试使用特定的电路板,请尝试查看手册和/或联系制造商。
如果你想为很多不同的主板做这件事,我建议你联系SiSoftware之类的人,或者准备阅读很多主板手册。
另外注意,并非所有电路板都有温度监控器。
您也可能遇到从内核获得特权访问的问题。
答案 3 :(得分:3)
有一篇博客文章,其中包含一些关于如何操作的C#示例代码here。
答案 4 :(得分:2)
这取决于您的计算机是否支持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();
}
}
}
}
您需要以管理员身份运行此演示。
您可以在此处查看教程: http://www.lattepanda.com/topic-f11t3004.html
答案 5 :(得分:2)
我将CPU部件从Open Hardware Monitor中提取到一个独立的库中,将通常隐藏在OHM中的传感器和成员暴露出来。 它还包括许多更新(例如对Ryzen和Xeon的支持),因为在OHM上他们自2015年以来不接受拉取请求。
https://www.nuget.org/packages/HardwareProviders.CPU.Standard/
让我们知道你的意见:)
答案 6 :(得分:1)
可以通过WMI在您的代码中完成。我找到了一个Microsoft的工具,可以为它创建代码。
WMI Code Creator工具允许您生成VBScript,C#和VB 使用WMI完成管理任务(如查询)的.NET代码 用于管理数据,从WMI类执行方法或接收 使用WMI的事件通知。
您可以下载here。
答案 7 :(得分:1)
尽管它不支持最新的处理器,但您可以试用开放式硬件监视器。
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的引用。
答案 8 :(得分:1)
提到的 WMI 类在最新版本的 Windows 10 中对我不起作用。
在我的戴尔笔记本电脑上,我可以像这样通过 PowerShell 获得 CPU 温度(以摄氏度为单位):
$data = Get-WMIObject -Query "SELECT * FROM Win32_PerfFormattedData_Counters_ThermalZoneInformation" -Namespace "root/CIMV2"
@($data)[0].HighPrecisionTemperature