C#采集电脑硬件(CPU、GPU、硬盘、内存等)温度和使用状况

这是采集出来的Json,部分电脑(特别是笔记本)无法获取到:

{"HardwareList": [{"Name": "MITX-6999","Type": "主板","Sensors": [],"WmiReport": null}, {"Name": "Intel Core i5-8500","Type": "CPU","Sensors": [{"Name": "CPU Core #1","Type": "Load","Value": 7.142857,"Unit": "%"}, {"Name": "CPU Core #2","Type": "Load","Value": 7.142857,"Unit": "%"}, {"Name": "CPU Core #3","Type": "Load","Value": 7.142857,"Unit": "%"}, {"Name": "CPU Core #4","Type": "Load","Value": 7.142857,"Unit": "%"}, {"Name": "CPU Core #5","Type": "Load","Value": 14.2857141,"Unit": "%"}, {"Name": "CPU Core #6","Type": "Load","Value": 14.2857141,"Unit": "%"}, {"Name": "CPU Total","Type": "Load","Value": 9.523809,"Unit": "%"}, {"Name": "CPU Core #1","Type": "Temperature","Value": 45.0,"Unit": "°C"}, {"Name": "CPU Core #2","Type": "Temperature","Value": 44.0,"Unit": "°C"}, {"Name": "CPU Core #3","Type": "Temperature","Value": 43.0,"Unit": "°C"}, {"Name": "CPU Core #4","Type": "Temperature","Value": 44.0,"Unit": "°C"}, {"Name": "CPU Core #5","Type": "Temperature","Value": 44.0,"Unit": "°C"}, {"Name": "CPU Core #6","Type": "Temperature","Value": 43.0,"Unit": "°C"}, {"Name": "CPU Package","Type": "Temperature","Value": 45.0,"Unit": "°C"}, {"Name": "CPU Core #1","Type": "Clock","Value": 3900.00073,"Unit": "MHz"}, {"Name": "CPU Core #2","Type": "Clock","Value": 3900.00073,"Unit": "MHz"}, {"Name": "CPU Core #3","Type": "Clock","Value": 3900.00073,"Unit": "MHz"}, {"Name": "CPU Core #4","Type": "Clock","Value": 3900.00073,"Unit": "MHz"}, {"Name": "CPU Core #5","Type": "Clock","Value": 3900.00073,"Unit": "MHz"}, {"Name": "CPU Core #6","Type": "Clock","Value": 3900.00073,"Unit": "MHz"}, {"Name": "CPU Package","Type": "Power","Value": 15.735323,"Unit": "W"}, {"Name": "CPU Cores","Type": "Power","Value": 14.8387508,"Unit": "W"}, {"Name": "CPU Graphics","Type": "Power","Value": 0.04656077,"Unit": "W"}, {"Name": "CPU DRAM","Type": "Power","Value": 0.446761668,"Unit": "W"}, {"Name": "Bus Speed","Type": "Clock","Value": 100.000015,"Unit": "MHz"}],"WmiReport": null}, {"Name": "Generic Memory","Type": "内存","Sensors": [{"Name": "Memory","Type": "Load","Value": 28.5646687,"Unit": "%"}, {"Name": "Used Memory","Type": "Data","Value": 2.25409317,"Unit": "GB"}, {"Name": "Available Memory","Type": "Data","Value": 5.6371,"Unit": "GB"}],"WmiReport": null}, {"Name": "128GB SATA SSD","Type": "硬盘","Sensors": [{"Name": "Temperature","Type": "Temperature","Value": 31.0,"Unit": "°C"}, {"Name": "Used Space","Type": "Load","Value": 14.6201363,"Unit": "%"}],"WmiReport": "硬盘温度: 0°C\r\n硬盘温度: 1°C\r\n"}, {"Name": "ST1000VX012-3CU10C","Type": "硬盘","Sensors": [{"Name": "Temperature","Type": "Temperature","Value": 38.0,"Unit": "°C"}, {"Name": "Used Space","Type": "Load","Value": 0.06617792,"Unit": "%"}],"WmiReport": "硬盘温度: 0°C\r\n硬盘温度: 1°C\r\n"}],"ErrorMessage": null,"Success": true
}

下面是代码:

  1. 引用OpenHardwareMonitorLib.dll
  2. 调用
	HardwareMonitor hardwareMonitor = new HardwareMonitor();HardwareMonitorModel hardwareMonitorModel = hardwareMonitor.GetHardwareInfo();
  1. 实现
public class HardwareMonitor
{private Computer computer;public HardwareMonitor(){computer = new Computer{CPUEnabled = true,GPUEnabled = true,HDDEnabled = true,MainboardEnabled = true,RAMEnabled = true // 新增内存监控};}public HardwareMonitorModel GetHardwareInfo(){var model = new HardwareMonitorModel();try{computer.Open();// 多次更新以确保数据稳定for (int i = 0; i < 3; i++){UpdateAllHardware();System.Threading.Thread.Sleep(100);}// 收集硬件信息foreach (var hardware in computer.Hardware){var hardwareInfo = new HardwareInfo{Name = hardware.Name,Type = GetHardwareTypeString(hardware.HardwareType),WmiReport = hardware.HardwareType == HardwareType.HDD ? GetHddWmiReport(hardware.Name) : null};// 处理主硬件传感器CollectSensors(hardware, hardwareInfo);// 处理子硬件传感器foreach (var subHardware in hardware.SubHardware){CollectSensors(subHardware, hardwareInfo);}// 特殊处理AMD GPU温度if (hardware.HardwareType == HardwareType.GpuAti){var amdGpuTemp = GetAmdGpuTemperature(hardware.Name);if (amdGpuTemp.HasValue){hardwareInfo.Sensors.Add(new SensorInfo{Name = "Temperature",Type = "Temperature",Value = amdGpuTemp.Value,Unit = "°C"});}}model.HardwareList.Add(hardwareInfo);}model.Success = true;}catch (Exception ex){model.ErrorMessage = $"获取硬件信息失败: {ex.Message}\n提示: 请确保以管理员权限运行程序";model.Success = false;}finally{computer.Close();}return model;}private void UpdateAllHardware(){foreach (var hardware in computer.Hardware){hardware.Update();// 特殊处理硬盘if (hardware.HardwareType == HardwareType.HDD){hardware.GetReport();}foreach (var subHardware in hardware.SubHardware){subHardware.Update();}}}private void CollectSensors(IHardware hardware, HardwareInfo hardwareInfo){foreach (var sensor in hardware.Sensors){if (sensor.Value.HasValue){hardwareInfo.Sensors.Add(new SensorInfo{Name = sensor.Name,Type = sensor.SensorType.ToString(),Value = sensor.Value,Unit = GetSensorUnit(sensor.SensorType)});}}}private float? GetAmdGpuTemperature(string gpuName){try{using (var searcher = new ManagementObjectSearcher(@"root\AMD\GPU", "SELECT * FROM GPU_Thermal")){foreach (var obj in searcher.Get()){if (obj["DeviceName"].ToString().Contains(gpuName)){return Convert.ToSingle(obj["Temperature"]);}}}}catch { }return null;}private string GetHddWmiReport(string hddName){var report = new StringBuilder();try{using (var searcher = new ManagementObjectSearcher(@"root\WMI", "SELECT * FROM MSStorageDriver_FailurePredictData")){foreach (var obj in searcher.Get()){byte[] data = (byte[])obj["VendorSpecific"];if (data != null && data.Length >= 10){// SMART属性194通常是温度byte temperature = data[10];report.AppendLine($"硬盘温度: {temperature}°C");}}}}catch { }return report.Length > 0 ? report.ToString() : null;}private string GetHardwareTypeString(HardwareType type){switch (type){case HardwareType.CPU: return "CPU";case HardwareType.GpuNvidia: return "NVIDIA GPU";case HardwareType.GpuAti: return "AMD GPU";case HardwareType.HDD: return "硬盘";case HardwareType.Mainboard: return "主板";case HardwareType.RAM: return "内存";default: return type.ToString();}}private string GetSensorUnit(SensorType type){switch (type){case SensorType.Temperature: return "°C";case SensorType.Fan: return "RPM";case SensorType.Voltage: return "V";case SensorType.Clock: return "MHz";case SensorType.Load:case SensorType.Control: return "%";case SensorType.Power: return "W";case SensorType.Data: return "GB";case SensorType.Factor: return "";default: return "";}}
}
  1. 使用到的Model对象
	public class HardwareInfo{public string Name { get; set; }public string Type { get; set; }public List<SensorInfo> Sensors { get; set; }public string WmiReport { get; set; }public HardwareInfo(){Sensors = new List<SensorInfo>();}}public class HardwareMonitorModel{public List<HardwareInfo> HardwareList { get; set; }public string ErrorMessage { get; set; }public bool Success { get; set; }public HardwareMonitorModel(){HardwareList = new List<HardwareInfo>();}}public class SensorInfo{public string Name { get; set; }public string Type { get; set; }public float? Value { get; set; }public string Unit { get; set; }}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/88190.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/88190.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C3新增特性

✅ 一、选择器&#xff08;Selectors&#xff09; 1. 属性选择器 [attr^value]: 匹配属性值以特定字符串开头的元素。[attr$value]: 匹配属性值以特定字符串结尾的元素。[attr*value]: 匹配属性值包含特定字符串的元素。 2. 子元素和兄弟元素选择器 :nth-child(n): 匹配父元…

报错 @import “~element-ui/packages/theme-chalk/src/index“;

报错 import "~element-ui/packages/theme-chalk/src/index"; 具体报错报错原因 具体报错 SassError: Can’t find stylesheet to import. import “~element-ui/packages/theme-chalk/src/index”; src\views\login\theme\element-variables.scss 8:9 root stylesh…

ESLint从入门到实战

引言 作为前端开发者&#xff0c;你是否遇到过这样的情况&#xff1a;团队成员写出的代码风格各异&#xff0c;有人喜欢用分号&#xff0c;有人不用&#xff1b;有人用双引号&#xff0c;有人用单引号&#xff1b;代码评审时总是在纠结这些格式问题而不是业务逻辑&#xff1f;…

vue3实现markdown文档转HTML并可更换样式

vue3实现markdown文档转HTML 安装marked npm install marked<template><!-- 后台可添加样式编辑器 --><div class"markdown-editor" :class"{ fullscreen: isFullscreen, preview-mode: isPreviewMode }"><div class"editor-c…

Temu 实时获取商品动态:一个踩坑后修好的抓数脚本笔记

Temu 作为一个增长迅猛的购物平台&#xff0c;其商品价格、库存等信息&#xff0c;对许多做运营分析的小伙伴来说非常有参考价值。 我在写这个小工具的时候&#xff0c;踩了很多坑&#xff0c;特别记录下来&#xff0c;希望对你有用。 初版代码&#xff1a;想当然的“直接来一下…

【软考高级系统架构论文】论数据分片技术及其应用

论文真题 数据分片就是按照一定的规则,将数据集划分成相互独立、 正交的数据子集,然后将数据子集分布到不同的节点上。通过设计合理的数据分片规则,可将系统中的数据分布在不同的物理数据库中,达到提升应用系统数据处理速度的目的。 请围绕“论数据分片技术及其应用”论题…

VR飞夺泸定桥沉浸式历史再现​

当你戴上 VR 设备开启这场震撼人心的 VR 飞夺泸定桥体验&#xff0c;瞬间就会被拉回到 1935 年那个战火纷飞的 VR 飞夺泸定桥的岁月&#xff0c;置身于泸定桥的西岸 。映入眼帘的是一座由 13 根铁索组成的泸定桥&#xff0c;它横跨在波涛汹涌的大渡河上&#xff0c;桥下江水咆哮…

libwebsockets编译

#安装 libwebsocket git clone https://github.com/warmcat/libwebsockets && \ mkdir libwebsockets/build && cd libwebsockets/build && \ cmake -DMAKE_INSTALL_PREFIX:PATH/usr -DCMAKE_C_FLAGS"-fpic" .. && \ make &&…

使用docker部署epg节目单,同时管理自己的直播源

配置 Docker 环境 拉取镜像并运行&#xff1a; docker run -d \--name php-epg \-v /etc/epg:/htdocs/data \-p 5678:80 \--restart unless-stopped \taksss/php-epg:latest 默认数据目录为 /etc/epg &#xff0c;根据需要自行修改 默认端口为 5678 &#xff0c;根据需要自行修…

H5新增属性

✅ 一、表单相关新增属性&#xff08;Form Attributes&#xff09; 这些属性增强了表单功能&#xff0c;提升用户体验和前端验证能力。 1. placeholder 描述&#xff1a;在输入框为空时显示提示文本。示例&#xff1a; <input type"text" placeholder"请输…

【C++】简单学——引用

引用的概念 为一个变量指定一个别名 引用的规则 用之前要初始化使用了之后就不能修改指向了&#xff08;对一个引用赋值实际上是对原本被引用的那个值进行赋值&#xff0c;而不是改变指向&#xff09;一个对象可以同时有多个引用 问&#xff1a;引用可以完全代替指针吗&…

C#编程与1200PLC S7通信

读取q0.0的状态,i0.0的状态实时在窗口更新 PLC里写一个程序 用常闭按钮接i0.0信号 &#xff0c;延时接通Q0.0 按按钮&#xff0c;上位机测试效果, 2396fcfa823aa951d 程序前提是引用了S7通信文件 using Sharp7; using System; using System.Collections.Generic; using S…

el-table复选框分页多选

场景&#xff1a; 你想要对el-table表格数据进行批量处理&#xff0c;会使用复选框&#xff0c;但如果表格的数据是分页请求回来的&#xff0c;则在切换页码的时候&#xff0c;之前选中的数据会被清空掉&#xff0c;本文就是为了解决这个问题。 解决思路&#xff1a; 主要分…

大IPD之——学习华为的市场队伍建设(二十)

企业要生存&#xff0c;就必须要拥有自己的核心竞争力。这样在行业内与其他企业竞争时&#xff0c;才能立于不败之地&#xff0c;而伴随着企业的市场化&#xff0c;市场机制对企业价值创造的影响力越来越大。30多年来&#xff0c;华为高度重视市场队伍与市场能力建设&#xff0…

Datawhlale_快乐学习大模型_task02_NLP 基础概念

书籍地址 简要总结一下个人理解 文章目录 1.1 NLP1.2 发展历程1.3 NLP任务1.3.1 中文分词1.3.2 子词切分1.3.3 词性标注1.3.4 文本分类1.3.5 实体识别1.3.6 关系抽取1.3.7 文本摘要1.3.8 机器翻译1.3.9 自动问答 1.4 文本表示的发展1.4.1 词向量1.4.2 语言模型1.4.3 Word2Vec…

AUTOSAR图解==>AUTOSAR_AP_SWS_Persistency

AUTOSAR 持久化功能集群解析 1. 引言 AUTOSAR (AUTomotive Open System ARchitecture) 适配平台中的持久化功能集群(Persistency Functional Cluster)是一个核心组件&#xff0c;为应用程序提供数据持久化服务。本文档详细分析了AUTOSAR持久化功能集群的架构、主要组件和工作…

Ollama常用命令详解:本地大语言模型管理指南

前言 Ollama是一个强大的本地大语言模型管理工具&#xff0c;让我们可以轻松地在本地部署和运行各种开源大模型。本文将详细介绍Ollama的核心命令使用方法&#xff0c;帮助您快速上手本地AI模型的管理和使用。 1. 查看已安装模型 - ollama list 基本用法 ollama list功能说…

[免费]SpringBoot+Vue共享单车信息系统【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue共享单车信息系统【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue共享单车信息系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 快速发展的社会中&#xff…

内网提权-DC-3靶场实验(Ubantu16.04)

靶场地址 https://download.vulnhub.com/dc/DC-3-2.zip 打开DC-3 使用kali扫描获取靶场ip 目录扫描获取后台地址 弱口令admin/snoopy进入后台 此处可写入一句话木马 创建文件写入一句话木马 哥斯拉上线 使用lsb_release -a命令查看内核版本 方法一 使用ubuntu漏洞库发现该…

Nginx:互斥锁 accept_mutex配置

如何配置 Nginx 的互斥锁 accept_mutex 1. 理解 accept_mutex 的作用 accept_mutex 是 Nginx 用于控制多工作进程&#xff08;worker processes&#xff09;接收新连接时避免「惊群问题&#xff08;Thundering Herd&#xff09;」的机制。 启用时&#xff08;accept_mutex o…