C#利用开源库OpenHardwareMonitor获取CPU或显卡温度、使用率、时钟频率

最近做一个项目,需要监控到CPU温度,起初利用WMI方式去监测CPU温度,发现温度一直不变,于是各种问度娘,逛论坛,也没找到具体原因,大致意思就是我获取的是个假温度,这块行不通,只能换个方向,偶然看到别人有用OpenHardwareMonitor这个开源库来实现温度获取的,于是各种找资源各种研究,终于明白了怎么运用这个库来获取我们所需要的信息,至于原理,很惭愧还没研究透,后续有时间研究透了再开一篇。写这篇文章目的一是备忘,二是给跟我一样的菜鸟朋友一些参考,文章中所包含的资源在末尾我会给出链接,欢迎下载。

先上OpenHardwareMonitor运行时的主界面

C#利用开源库OpenHardwareMonitor获取CPU或显卡温度、使用率、时钟频率_第1张图片

大家先忽略本菜鸟渣机的硬件信息,可以看到这个开源库能实现的功能还是挺多的,CUP、显卡的时钟、温度、使用率都可以获取的到,接下来给大家简要分析一下OpenHardwareMonitor的源码部分

C#利用开源库OpenHardwareMonitor获取CPU或显卡温度、使用率、时钟频率_第2张图片

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,
    }

可以看到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分资源了

下载链接

你可能感兴趣的:(C#利用开源库OpenHardwareMonitor获取CPU或显卡温度、使用率、时钟频率)