以下是在C#中读取CPU、硬盘和内存温度的完整解决方案,包含多种实现方式。
![图片[1]_C# 读取硬件温度完整指南_知途无界](https://zhituwujie.com/wp-content/uploads/2025/06/d2b5ca33bd20250613102840.png)
1. 使用WMI (Windows Management Instrumentation)
这是最通用的方法,适用于大多数Windows系统。
using System;
using System.Management;
public class HardwareMonitor
{
public static void GetHardwareTemperatures()
{
try
{
// CPU温度
Console.WriteLine("CPU温度:");
GetCpuTemperature();
// 硬盘温度
Console.WriteLine("\n硬盘温度:");
GetHddTemperature();
// 内存温度(通常不可用)
Console.WriteLine("\n内存温度:");
GetMemoryTemperature();
}
catch (Exception ex)
{
Console.WriteLine($"错误: {ex.Message}");
}
}
private static void GetCpuTemperature()
{
ManagementObjectSearcher searcher = new ManagementObjectSearcher(
@"root\WMI",
"SELECT * FROM MSAcpi_ThermalZoneTemperature");
foreach (ManagementObject obj in searcher.Get())
{
double tempKelvin = Convert.ToDouble(obj["CurrentTemperature"].ToString());
double tempCelsius = (tempKelvin - 2732) / 10.0;
Console.WriteLine($"CPU核心温度: {tempCelsius}°C");
}
}
private static void GetHddTemperature()
{
ManagementObjectSearcher searcher = new ManagementObjectSearcher(
@"root\WMI",
"SELECT * FROM MSStorageDriver_ATAPISmartData");
foreach (ManagementObject obj in searcher.Get())
{
byte[] bytes = (byte[])obj["VendorSpecific"];
for (int i = 0; i < bytes.Length; i += 12)
{
if (bytes[i + 1] == 0xC2 && bytes[i + 3] == 0x00)
{
int temp = bytes[i + 5];
Console.WriteLine($"硬盘温度: {temp}°C");
break;
}
}
}
}
private static void GetMemoryTemperature()
{
// 内存温度通常不可通过WMI获取
Console.WriteLine("内存温度信息不可用");
}
}
2. 使用Open Hardware Monitor库
需要先安装OpenHardwareMonitorLib.dll
using OpenHardwareMonitor.Hardware;
using System;
using System.Threading;
public class OpenHardwareMonitor
{
public static void Monitor()
{
Computer computer = new Computer
{
CPUEnabled = true,
GPUEnabled = true,
HDDEnabled = true,
RAMEnabled = true,
MainboardEnabled = true
};
computer.Open();
while (true)
{
computer.Accept(new UpdateVisitor());
foreach (IHardware hardware in computer.Hardware)
{
Console.WriteLine($"硬件: {hardware.Name}");
hardware.Update();
foreach (ISensor sensor in hardware.Sensors)
{
if (sensor.SensorType == SensorType.Temperature)
{
Console.WriteLine($" {sensor.Name}: {sensor.Value}°C");
}
}
}
Thread.Sleep(1000);
Console.Clear();
}
}
}
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) { }
}
3. 使用LibreHardwareMonitor库
更现代的替代方案,需要安装LibreHardwareMonitorLib.dll
using LibreHardwareMonitor.Hardware;
using System;
using System.Threading;
public class LibreHardwareMonitor
{
public static void Monitor()
{
Computer computer = new Computer
{
IsCpuEnabled = true,
IsGpuEnabled = true,
IsMemoryEnabled = true,
IsStorageEnabled = true
};
computer.Open();
while (true)
{
foreach (IHardware hardware in computer.Hardware)
{
hardware.Update();
Console.WriteLine($"硬件: {hardware.Name} ({hardware.HardwareType})");
foreach (ISensor sensor in hardware.Sensors)
{
if (sensor.SensorType == SensorType.Temperature && sensor.Value.HasValue)
{
Console.WriteLine($" {sensor.Name}: {sensor.Value}°C");
}
}
}
Thread.Sleep(1000);
Console.Clear();
}
}
}
4. 注意事项
- 权限问题:
- 需要以管理员权限运行程序
- 某些防病毒软件可能会阻止访问
- 兼容性问题:
- 不同硬件厂商的实现可能不同
- 某些传感器可能无法被检测到
- 性能考虑:
- 频繁查询(如每秒多次)可能影响系统性能
- 考虑添加适当的延迟
- 错误处理:
- 始终添加try-catch块处理异常
- 检查返回值是否为null
- 替代方案:
- 对于游戏开发等场景,可以考虑使用厂商SDK(如NVIDIA NVAPI)
- 企业环境可以考虑使用SNMP协议
5. 完整示例程序
using System;
using System.Management;
class Program
{
static void Main()
{
Console.WriteLine("硬件温度监控");
Console.WriteLine("1. WMI方法");
Console.WriteLine("2. OpenHardwareMonitor方法");
Console.Write("选择方法: ");
var choice = Console.ReadLine();
switch(choice)
{
case "1":
HardwareMonitor.GetHardwareTemperatures();
break;
case "2":
OpenHardwareMonitor.Monitor();
break;
default:
Console.WriteLine("无效选择");
break;
}
Console.WriteLine("按任意键退出...");
Console.ReadKey();
}
}
以上代码提供了多种方法来获取硬件温度信息,您可以根据具体需求选择最适合的方案。对于生产环境,建议使用LibreHardwareMonitor库,它提供了最全面和稳定的硬件监控功能。
© 版权声明
文中内容均来源于公开资料,受限于信息的时效性和复杂性,可能存在误差或遗漏。我们已尽力确保内容的准确性,但对于因信息变更或错误导致的任何后果,本站不承担任何责任。如需引用本文内容,请注明出处并尊重原作者的版权。
THE END

























暂无评论内容