CSharp - 硬件信息查询监控

2022年08月04日 · 笔记 · CSharp · 170次阅读

说明

本篇文章采用第三方开源库openhardwaremonitor来辅助编写查询信息,并且网上大多都是采用这种方式监控硬件信息。
常用的硬件信息有:温度、时钟频率、电压、内存占用、存储空间占用、网络传输状态···
这里仅获取到CPU温度以及GPU温度,其他查询方式类似,自己琢磨...

一.下载第三方库

下载方式:

  1. 项目开源地址:https://github.com/hexagon-oss/openhardwaremonitor,自己去releases中下载最新版本
    并且自己编译好后,找到生成文件夹中的OpenHardwareMonitorLib.dll,我们就使用它!
  2. 这里提供文章的第三方dll文件OpenHardwareMonitorLib.rar,解压打开即可(Ver:0.9.7.11)

二.引用dll文件

  1. 如图打开项目 - 右键引用 - 添加引用
  2. 点击"浏览" - 选中下载解压好的dll文件即可。

三.使用

  1. 这里首先引用命名空间

    using OpenHardwareMonitor.Hardware;
    using System;
  2. 然后复制粘贴下面的类

     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) { }
     }
    
     public class ComputerCore
     {
         private UpdateVisitor updateVisitor = new UpdateVisitor();
         private Computer computer = new Computer();
    
         public ComputerCore()
         {
             computer.Open();
             computer.CPUEnabled = true;//开启CPU信息监控
             computer.GPUEnabled = true;//开启GPU信息监控
             computer.Accept(updateVisitor);
         }
    
         /// <summary>
         /// 获取CPU温度
         /// </summary>
         /// <returns></returns>
         public float GetCpuTemp()
         {
             computer.Accept(updateVisitor);
             float num = 0;
             float cc = 0;
             float avg = 0;
             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)
                         {
                             if (computer.Hardware[i].Sensors[j].Value is null)
                                 continue;
    
                             num += (float)computer.Hardware[i].Sensors[j].Value;
                             if((float)computer.Hardware[i].Sensors[j].Value!=0)
                                 cc++;
                             avg = num / cc;
                         }
                     }
                 }
             }
             return avg;
         }
    
         /// <summary>
         /// 获取GPU温度
         /// </summary>
         /// <param name="isNva">是不是英伟达GPU</param>
         /// <returns></returns>
         public float GetGpuTemp(bool isNva = true)
         {
             computer.Accept(updateVisitor);
             HardwareType type = isNva ? HardwareType.GpuNvidia : HardwareType.GpuAti;
    
             for (int i = 0; i < computer.Hardware.Length; i++)
             {
                 //查找硬件类型为CPU
                 if (computer.Hardware[i].HardwareType == type)
                 {
                     for (int j = 0; j < computer.Hardware[i].Sensors.Length; j++)
                     {
                         //找到温度传感器
                         if (computer.Hardware[i].Sensors[j].SensorType == SensorType.Temperature)
                         {
                             if (computer.Hardware[i].Sensors[j].Value is null)
                                 continue;
    
                             return (float)computer.Hardware[i].Sensors[j].Value;
                         }
                     }
                 }
             }
             return 0;
         }
    
     }
    
  3. 调用即可
    实例化:public ComputerCore CCore= new ComputerCore();
    CPU温度:CCore.GetCpuTemp()
    GPU温度:CCore.GetGpuTemp()(英伟达显卡) - CCore.GetGpuTemp(false)(非英伟达显卡)

注意

  • 项目框架的Framework 版本要求 4.8
  • 引用后直接使用会出错,这里需要下载一个NuGet包

    作者使用的就是5.0.0版本,我也就没找事,用最新版。可自行测试。
  • CPU温度因为有很多内核 每个内核温度不一样,所以我取了平均值。

标签:C#

最后编辑于:2022-08-04 23:45

评论

Lover

搜一搜

云资源站点