上次接手了一个需要对服务器的检测系统软件,但是在获取CPU温度的时候总是出问题,查找了很多的资料,总结了以下两种方法,是比较常见的
//第一种方法 就是传统的 wimi 方式获取 ,需要引进一个命名空间 using System.Management;
public static void GetCPUTemperature()
{
string str = "";
ManagementObjectSearcher vManagementObjectSearcher = new ManagementObjectSearcher(@"root\WMI", @"select * from MSAcpi_ThermalZoneTemperature");
foreach (ManagementObject managementObject in vManagementObjectSearcher.Get())
{
str += managementObject.Properties["CurrentTemperature"].Value.ToString();
}
//这就是CPU的温度了
float temp = (float.Parse(str) - 2732) / 10;
}
这种方式往往跟服务器本身的硬件配置是有关系的,可能会在 foreach (ManagementObject managementObject in vManagementObjectSearcher.Get()) 这一行代码报错
解决方案一:用管理员身份运行你的项目 (如果还是有错的话,那就使用第二种方式吧)
///第二种方法 据说是非wimi方式,好像是通过虚拟硬盘读取的(没看太懂)(也是要以管理员身份运行这个软件)
这个方法需要引进一些现有的开源类库(OpenHardwareMonitor.csproj,OpenHardwareMonitorLib.csproj)
下载地址:http://download.csdn.net/detail/liyanping521/5216007
这种方法是借鉴别人的,是一个OpenHardwareMonitor的开源检测软件,有源码和使用方法
Open Hardware Monitor可以支持大部分常见的主板芯片与硬件组件,监控包含主板、CPU、硬盘、显示卡、装置的电压、温度、风扇转速与运作频率、负载等信息。
使用方法:将库添加至项目中(就是将你下载的项目源码放你的项目里边或者是引用编译好的dll 文件)
声明:
PersistentSettings settings =new PersistentSettings();
UpdateVisitor updateVisitor = new UpdateVisitor();
初始化config配置文件,详情见Bin目录Debug/Replase\OpenHardwareMonitor.config文件
//Application 的命名空间是 System.Windows.Forms; 别引用错了
settings.Load(Path.ChangeExtension(
Application.ExecutablePath, ".config"));
初始化Computer对象
Computer computer= new Computer(settings);
调用open方法,这个方法一定要打开
conputer.open();
获取cpu温度:
StringBuilder str = new StringBuilder();
computer.Accept(updateVisitor);
for (int i = 0; i < computer.Hardware.Length; i++)
{
//循环找到HardwareType为cpu
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)
{
//获取到cpu核心
str.Append(computer.Hardware[i].Sensors[j].Name);
str.Append("\t");
//这里就是cpu温度了
str.Append(computer.Hardware[i].Sensors[j].Value.ToString());
str.Append("\n");
}
}
}
}
Console.WriteLine(str.ToString());