最近做一个项目,需要监控到CPU温度,起初利用WMI方式去监测CPU温度,发现温度一直不变,于是各种问度娘,逛论坛,也没找到具体原因,大致意思就是我获取的是个假温度,这块行不通,只能换个方向,偶然看到别人有用OpenHardwareMonitor这个开源库来实现温度获取的,于是各种找资源各种研究,终于明白了怎么运用这个库来获取我们所需要的信息,至于原理,很惭愧还没研究透,后续有时间研究透了再开一篇。写这篇文章目的一是备忘,二是给跟我一样的菜鸟朋友一些参考,文章中所包含的资源在末尾我会给出链接,欢迎下载。
先上OpenHardwareMonitor运行时的主界面
大家先忽略本菜鸟渣机的硬件信息,可以看到这个开源库能实现的功能还是挺多的,CUP、显卡的时钟、温度、使用率都可以获取的到,接下来给大家简要分析一下OpenHardwareMonitor的源码部分
OpenHardwareMonitor源代码中有两个程序集:OpenHardwareMonitor和OpenHardwareMonitorLib
OpenHardwareMonitor是一个winform程序,运行时就是图一的窗口,OpenHardwareMonitorLib是一个类库,运行时生成OpenHardwareMonitorLib.DLL这个动态链接库,而我们要实现CPU温度等信息的获取,就是要引用这个DLL
本菜鸟一直认为,要研究透一种新方法、新技能,首先要学会怎么去熟练应用它,接下来我们就来讲讲怎么应用这个DLL。
首先,你得添加这个OpenHardwareMonitorLib.DLL的引用,然后引用OpenHardwareMonitor.Hardware这个命名空间这里不多说,先上一段代码,主要是继承IVisitor这个接口,本屌愚见,这个接口大概是为了继承一些访问方法,接下来的代码中会用到。
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) { }
}
接下来要实例化我们访问的对象,这里命名为computer,通过computer这个对象的一些属性,我们可以得到我们需要获取的信息
UpdateVisitor updateVisitor = new UpdateVisitor();
Computer computer = new Computer();
computer.Open();
computer.Accept(updateVisitor);
对象已经有了,接下来。。。说到这,我还没有对象默哀3秒。
收起沉重的心情,我们继续讲,既然这个对象已经有了,我们就可以做更多的事情了。。。不要想歪,我指的是我们可以知道我们的computer对象有几个硬件,比如CPU啊、显卡啊,这里我们可以做一个循环遍历,找到我们需要的硬件
for (int i = 0; i < computer.Hardware.Length; i++)
{
//查找硬件类型为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)
{
textBox1.Text=computer.Hardware[i].Sensors[j].Value.ToString();
}
}
}
}
我们来分析一下上面这段代码
Hardware[i]中保存了OpenHardwareMonitorLib.DLL获取到的硬件信息,可以通过HardwareType这个枚举变量来查看它支持的硬件
public enum HardwareType
{
Mainboard = 0,
SuperIO = 1,
CPU = 2,
GpuNvidia = 3,
GpuAti = 4,
TBalancer = 5,
Heatmaster = 6,
HDD = 7,
}
接下来就可以获取CPU的温度值了,怎么获取呢,我们看到Hardware中有一个Sensor属性,看一下这个SensorType枚举变量
public enum SensorType
{
Voltage = 0,
Clock = 1,
Temperature = 2,
Load = 3,
Fan = 4,
Flow = 5,
Control = 6,
Level = 7,
}
很强大有没有,时钟、温度、使用率。。。
以温度为例,接下来我们做一个判断computer.Hardware[i].Sensors[j].SensorType == SensorType.Temperature,当传感器为温度传感器时,记录当前的温度值textBox1.Text=computer.Hardware[i].Sensors[j].Value.ToString()。
这里要说明一下,本菜鸟的电脑是双核的,在CUP的温度值中有3个值,CPU core#1、CPU core#2和CPU.package,也就是说computer.Hardware[i].Sensors[j].SensorType == SensorType.Temperature会有三次true的情况,至于取哪个值就看你怎么写了。
附上OpenHardwareMonitor源码+本文中使用案例,本想免费贡献给大家的,奈何CSDN没有0分资源了
下载链接