[置顶] C#利用开源库OpenHardwareMonitor获取CPU或显卡温度、使用率、时钟频率
2017-11-17 09:52
836 查看
最近做一个项目,需要监控到CPU温度,起初利用WMI方式去监测CPU温度,发现温度一直不变,于是各种问度娘,逛论坛,也没找到具体原因,大致意思就是我获取的是个假温度,这块行不通,只能换个方向,偶然看到别人有用OpenHardwareMonitor这个开源库来实现温度获取的,于是各种找资源各种研究,终于明白了怎么运用这个库来获取我们所需要的信息,至于原理,很惭愧还没研究透,后续有时间研究透了再开一篇。写这篇文章目的一是备忘,二是给跟我一样的菜鸟朋友一些参考,文章中所包含的资源在末尾我会给出链接,欢迎下载。
先上OpenHardwareMonitor运行时的主界面
大家先忽略本菜鸟渣机的硬件信息,可以看到这个开源库能实现的功能还是挺多的,CUP、显卡的时钟、温度、使用率都可以获取的到,接下来给大家简要分析一下OpenHardwareMonitor的源码部分
OpenHardwareMonitor源代码中有两个程序集:OpenHardwareMonitor和OpenHardwareMonitorLib
OpenHardwareMonitor是一个winform程序,运行时就是图一的窗口,OpenHardwareMonitorLib是一个类库,运行时生成OpenHardwareMonitorLib.DLL这个动态链接库,而我们要实现CPU温度等信息的获取,就是要引用这个DLL
本菜鸟一直认为,要研究透一种新方法、新技能,首先要学会怎么去熟练应用它,接下来我们就来讲讲怎么应用这个DLL。
首先,你得添加这个OpenHardwareMonitorLib.DLL的引用,然后引用OpenHardwareMonitor.Hardware这个命名空间这里不多说,先上一段代码,主要是继承IVisitor这个接口,本屌愚见,这个接口大概是为了继承一些访问方法,接下来的代码中会用到。
接下来要实例化我们访问的对象,这里命名为computer,通过computer这个对象的一些属性,我们可以得到我们需要获取的信息
对象已经有了,接下来。。。说到这,我还没有对象
默哀3秒。
收起沉重的心情,我们继续讲,既然这个对象已经有了,我们就可以做更多的事情了。。。不要想歪,我指的是我们可以知道我们的computer对象有几个硬件,比如CPU啊、显卡啊,这里我们可以做一个循环遍历,找到我们需要的硬件
我们来分析一下上面这段代码
Hardware[i]中保存了OpenHardwareMonitorLib.DLL获取到的硬件信息,可以通过HardwareType这个枚举变量来查看它支持的硬件
可以看到OpenHardwareMonitor还是很强大的,主板、A卡、N卡、硬盘等信息都可以获取,那么怎么获取指定的硬件信息呢
第一步判断Hardware[i].HardwareType是否为你要的硬件,以CPU为例:computer.Hardware[i].HardwareType == HardwareType.CPU
接下来就可以获取CPU的温度值了,怎么获取呢,我们看到Hardware中有一个Sensor属性,看一下这个SensorType枚举变量
很强大有没有,时钟、温度、使用率。。。
以温度为例,接下来我们做一个判断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分资源了
下载链接
先上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) 4000 { } }
接下来要实例化我们访问的对象,这里命名为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, }
可以看到OpenHardwareMonitor还是很强大的,主板、A卡、N卡、硬盘等信息都可以获取,那么怎么获取指定的硬件信息呢
第一步判断Hardware[i].HardwareType是否为你要的硬件,以CPU为例:computer.Hardware[i].HardwareType == HardwareType.CPU
接下来就可以获取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分资源了
下载链接
相关文章推荐
- 如何获取 Android 设备的CPU核数、时钟频率以及内存大小
- 如何获取 Android 设备的CPU核数、时钟频率以及内存大小
- 如何获取 Android 设备的CPU核数、时钟频率以及内存大小
- Python在Linux下获取CPU温度、使用率、内存使用率、硬盘使用率
- Android获取设备CPU核数、时钟频率以及内存大小的方法
- 如何获取 Android 设备的CPU核数、时钟频率以及内存大小
- Android获取CPU频率和温度
- 获取树莓派cpu温度、cpu使用率、内存使用率
- Android系统获取CPU和电池温度
- 获取树莓派当前状态和数据(温度、CPU、内存、硬盘)
- 通过sensors获取cpu温度
- 电脑清灰过后,CPU温度下降,显卡温度却上升了
- 获取NVIDIA显卡的温度
- Python获取CPU、内存使用率以及网络使用状态代码
- 【转】使用SYSTEMINFO类获取UNITY3D运行设备的各类信息(CPU类型,显卡类型等)
- 获取 CPU 使用率的单元
- 如何获取cpu频率
- android&nbsp;如何获取CPU频率(HZ…
- 获取cpu频率的代码
- CPU核心温度获取