我用这段代码来获取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的温度,硬盘温度,cpu风扇速度,以及所有其他信息。
我想知道他们是怎么做到的?为什么我收到“不支持”消息而这些程序没有?
3条答案
按热度按时间2jcobegt1#
这不是一个完整的答案,但希望能有所帮助。
在仔细阅读了https://code.google.com/p/open-hardware-monitor/source/browse/trunk/上的代码之后,如果不下载并进一步研究,我无法完全理解这段代码。
奇迹似乎就发生在这里
此代码从
Ring0.RdmsrTx
的结果中提取温度数据。Ring0
是一个C实现,其代码在这里的存储库中。这将从CPU驱动程序中读取M模型S特定R注册表数据。在this question中有更多细节。
fjaof16o2#
最简单的方法可能是找到一个工具,可以以机器可读的方式输出所需的信息,然后处理输出。SpeedFan将温度记录到日志中,您可以从日志中读取最新阅读。
我知道这可能不是一个理想的解决方案,但它是唯一的普遍性。在Windows系统中查询CPU温度不是一件容易的事情。
vohkndzv3#
我可能很晚才回答这个问题,但以防将来有人偶然发现这个问题,我是这样做的:
它与我完美地工作(即使它不工作的GPU部分)。您只需下载OpenHardwareMonitor(https://openhardwaremonitor.org/),然后添加到\openhardwareMonitor\Bin\Debug文件夹中的OpenHardwareMonitorLib.dll的引用,然后添加“using OpenHardwareMonitor.Hardware;“在顶部。
希望它仍然可以帮助别人,即使不OP!