我使用此代码来获取cpu温度,但我得不到支持'而不是温度。
public static string getCpuTemperature()
{
try
{
ManagementObjectSearcher searcher =
new ManagementObjectSearcher("root\\WMI",
"SELECT * FROM MSAcpi_ThermalZoneTemperature");
//Win32_TemperatureProbe
foreach (ManagementObject queryObj in searcher.Get())
{
double temp = Convert.ToDouble(queryObj["CurrentTemperature"].ToString());
double temp_critical = Convert.ToDouble(queryObj["CriticalTripPoint"].ToString());
double temp_cel = (temp / 10 - 273.15);
double temp_critical_cel = temp_critical / 10 - 273.15;
return temp_cel.ToString() + " _ " + temp_critical_cel.ToString();
}
}
catch (ManagementException e)
{
//MessageBox.Show("An error occurred while querying for WMI data: " + e.Message);
return e.Message.ToString();
}
return "";
}
我已经搜索了这个问题并且已经看到了很多答案,包括 - 主板不支持此功能 - 运行VS与管理权 等...
但它们都不是真的,因为像 OpenHardwareMonitor 和 SpeedFan 这样的程序会显示cpu和gpu的温度,Hdd温度,cpu风扇速度以及所有其他信息。
我想知道他们是怎么做到的?我得到了怎样的不被支持'消息和这些程序没有。
答案 0 :(得分:3)
这不是一个完整的答案,但希望它有所帮助。
仔细阅读https://code.google.com/p/open-hardware-monitor/source/browse/trunk/处的代码后,如果不下载所有代码并进一步调查,我无法完全理解此代码。
魔术似乎发生在这里,
public override void Update() {
base.Update();
for (int i = 0; i < coreTemperatures.Length; i++) {
uint eax, edx;
// if reading is valid
if (Ring0.RdmsrTx(IA32_THERM_STATUS_MSR, out eax, out edx,
1UL << cpuid[i][0].Thread) && (eax & 0x80000000) != 0)
{
// get the dist from tjMax from bits 22:16
float deltaT = ((eax & 0x007F0000) >> 16);
float tjMax = coreTemperatures[i].Parameters[0].Value;
float tSlope = coreTemperatures[i].Parameters[1].Value;
coreTemperatures[i].Value = tjMax - tSlope * deltaT;
} else {
coreTemperatures[i].Value = null;
}
}
...
此代码从Ring0.RdmsrTx
的结果中提取温度数据。
我相信Ring0
是环形缓冲区的C实现,其代码位于存储库here中。这将从CPU驱动程序中读取 M odel S 特定 R egister数据。
this question中有更详细的内容。
答案 1 :(得分:1)
最简单的方法可能是找到一种工具,它可以以机器可读的方式输出您需要的信息,然后处理该输出。 SpeedFan将温度记录到日志中,您可以从日志中读取最新的读数。
我意识到这可能不是一个理想的解决方案,但它是唯一的通用解决方案。在Windows系统中查询CPU温度并非易事。
答案 2 :(得分:0)
许多计算机不支持WMI,运行代码时会显示错误。但我可以通过openhardwaremonitor获得CPU温度。 这是代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenHardwareMonitor.Hardware;
namespace Get_CPU_Temp5
{
class Program
{
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) { }
}
static void GetSystemInfo()
{
UpdateVisitor updateVisitor = new UpdateVisitor();
Computer computer = new Computer();
computer.Open();
computer.CPUEnabled = true;
computer.Accept(updateVisitor);
for (int i = 0; i < computer.Hardware.Length; i++)
{
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)
Console.WriteLine(computer.Hardware[i].Sensors[j].Name + ":" + computer.Hardware[i].Sensors[j].Value.ToString() + "\r");
}
}
}
computer.Close();
}
static void Main(string[] args)
{
while (true)
{
GetSystemInfo();
}
}
}
}
答案 3 :(得分:0)
我回答这个问题可能很晚了,但是以防万一将来有人偶然发现这个问题,这就是我的做法:
public string getCPUTemp()
{
UpdateVisitor updateVisitor = new UpdateVisitor();
Computer computer = new Computer();
computer.Open();
computer.CPUEnabled = true;
computer.Accept(updateVisitor);
string res = "";
for (int i = 0; i < computer.Hardware.Length; i++)
{
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) res = String.Concat(res, (computer.Hardware[i].Sensors[j].Name + ": " + computer.Hardware[i].Sensors[j].Value.ToString() + "ºC" + "\r"));
if (computer.Hardware[i].Sensors[j].Value.ToString() == "") { res = ""; return res; }
}
}
}
它对我来说效果很好(即使它不适用于GPU部件)。您只需要下载OpenHardwareMonitor(https://openhardwaremonitor.org/),然后将对OpenHardwareMonitorLib.dll的引用添加到\ openhardwaremonitor \ Bin \ Debug文件夹中,然后添加“ using OpenHardwareMonitor.Hardware;”。在顶部。
希望即使没有OP,它仍然可以帮助某人!