我需要为我正在开发的应用程序收集一些系统信息.使用C#可以轻松获得可用内存和CPU负载.不幸的是,CPU温度并不那么容易.我尝试过使用WMI但是我无法使用任何东西
Win32_TemperatureProbe
Run Code Online (Sandbox Code Playgroud)
要么
MSAcpi_ThermalZoneTemperature
Run Code Online (Sandbox Code Playgroud)
有人已经处理过这个问题吗?我想知道像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;
}
}
Run Code Online (Sandbox Code Playgroud)
Jen*_*ens 56
对于可能来到这里的其他人,请查看:http://openhardwaremonitor.org/
请关注该链接,首先您可能会想,"嘿,这是一个应用程序,这就是它被删除的原因,问题是如何从C#代码执行此操作,而不是找到可以告诉我温度的应用程序......"它表明你不愿意花足够的时间阅读"开放式硬件监视器".
它们还包括一个数据接口,这里是描述:
数据接口 Open Hardware Monitor将所有传感器数据发布到WMI(Windows Management Instrumentation).这允许其他应用程序也读取和使用传感器信息.可以在此处找到界面的初步文档(单击).
当你下载它时,它包含OpenHardwareMonitor.exe应用程序,你不是在寻找那个.它还包含OpenHardwareMonitorLib.dll,您正在寻找那个.
它主要是,如果不是100%,只是围绕WinRing0 API的包装器,如果你愿意,你可以选择包装自己.
我自己从C#应用程序尝试了这个,它的工作原理.尽管它仍处于测试阶段,但似乎相当稳定.它也是开源的,所以它可能是一个很好的起点.
在一天结束时,我发现很难相信这不是这个问题的主题.
小智 31
我知道这篇文章很老,但只是想添加评论,如果有人应该看这篇文章并试图找到解决这个问题的方法.
您确实可以使用WMI方法在C#中轻松读取CPU温度.
为了获得Celsius值,我创建了一个包装器,它可以转换WMI返回的值并将其包装成一个易于使用的对象.
请记住System.Management.dll在Visual Studio中添加对引用的引用.
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;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
2010年6月25日更新:
(只是看到一个链接被发布到上面的相同类型的解决方案......无论如何,如果有人想要使用它,我会留下这段代码:-))
sam*_*moz 19
我很确定它是制造商依赖的,因为它们将通过I/O端口访问.如果您正在尝试使用特定的电路板,请尝试查看手册和/或联系制造商.
如果你想为很多不同的主板做这件事,我建议你联系某人,比如SiSoftware,或者准备阅读很多主板手册.
另外注意,并非所有电路板都有温度监控器.
您也可能遇到从内核获得特权访问的问题.
您可以试试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
}
}
}
Run Code Online (Sandbox Code Playgroud)
从官方源下载 ZIP 文件,提取并添加对项目中文件OpenHardwareMonitorLib.dll的引用。
我将 Open Hardware Monitor 中的 CPU 部分提取到一个单独的库中,暴露了通常隐藏在 OHM 中的传感器和成员。
它还包括许多更新(例如对Ryzen和Xeon的支持),因为在开放硬件监视器(OHM)上,他们自 2015 年以来就没有接受拉取请求。
https://www.nuget.org/packages/HardwareProviders.CPU.Standard/
| 归档时间: |
|
| 查看次数: |
107564 次 |
| 最近记录: |