我需要收集一些系统对我开发的应用程序的信息。 可用内存和CPU负载很容易使用C#来获得。 不幸的是,CPU温度就不是那么容易了。 我一直在使用WMI尝试,但使用我无法得到任何
Win32_TemperatureProbe
要么
MSAcpi_ThermalZoneTemperature
有没有人已经处理了这个问题? 我不知道如何监测方案,SiSoftware Sandra里,就可以得到这些信息?
万一有人有兴趣,这里是类的代码:
public class SystemInformation
{
private System.Diagnostics.PerformanceCounter m_memoryCounter;
private System.Diagnostics.PerformanceCounter m_CPUCounter;
public SystemInformation()
{
m_memoryCounter = new System.Diagnostics.PerformanceCounter();
m_memoryCounter.CategoryName = "Memory";
m_memoryCounter.CounterName = "Available MBytes";
m_CPUCounter = new System.Diagnostics.PerformanceCounter();
m_CPUCounter.CategoryName = "Processor";
m_CPUCounter.CounterName = "% Processor Time";
m_CPUCounter.InstanceName = "_Total";
}
public float GetAvailableMemory()
{
return m_memoryCounter.NextValue();
}
public float GetCPULoad()
{
return m_CPUCounter.NextValue();
}
public float GetCPUTemperature()
{
//...
return 0;
}
}
Answer 1:
我敢肯定它的制造商依赖,因为他们将通过一个I / O端口进行访问。 如果你有一个特定的板你想一起工作,尽量翻翻手册和/或制造商联系。
如果您想为很多不同的板做到这一点,我建议你联系的人在类似SiSoftware公司或准备读取主板手册了很多。
作为另一个注意,不是所有的主板有温度监控。
您也可能会遇到越来越从内核访问特权的问题。
Answer 2:
对于其他人谁可能会通过这里,也许看一看: http://openhardwaremonitor.org/
按照该链接,一开始你可能会想,“嘿,这是一个应用程序,这就是为什么它被删除,但问题是如何从C#代码做到这一点,没有找到一个应用程序,可以告诉我下......”这是它表明你是不是愿意读什么“开放的硬件监控”投入足够的时间也是。
它们还包括一个数据接口,这里是说明:
数据接口开放硬件监控发布所有传感器数据WMI(Windows管理规范)。 这将允许其他应用程序来读取和使用传感器的信息,以及。 接口的初步文件,可以发现这里(点击) 。
当你下载它,它包含了OpenHardwareMonitor.exe应用程序,你不找一个。 它还包含OpenHardwareMonitorLib.dll,你要找的那一个。
这主要是,如果不是100%,就在WinRing0 API,你可以选择,如果你喜欢它的感觉来包装你的自我包装。
我已经从C#尝试了这一点,应用程式自己,和它的作品。 尽管仍处于测试阶段,它似乎相当稳定。 这也是开源的所以它可能是一个很好的起点,而不是。
在一天结束时,我很难相信这是不是在这个问题上的话题。
Answer 3:
我知道这个帖子是老了,但只是想添加评论,如果有人应该看看这篇文章,试图找到一个解决这个问题。
你的确可以通过使用WMI的做法很容易读取CPU温度在C#。
要获得摄氏温度值,我已经创建了一个转换由WMI返回的值,并将其包装成一个易于使用的物体的包装。
请记住一个引用添加到System.Management.dll
在Visual Studio。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Management;
namespace RCoding.Common.Diagnostics.SystemInfo
{
public class Temperature
{
public double CurrentValue { get; set; }
public string InstanceName { get; set; }
public static List<Temperature> Temperatures
{
get
{
List<Temperature> result = new List<Temperature>();
ManagementObjectSearcher searcher = new ManagementObjectSearcher(@"root\WMI", "SELECT * FROM MSAcpi_ThermalZoneTemperature");
foreach (ManagementObject obj in searcher.Get())
{
Double temp = Convert.ToDouble(obj["CurrentTemperature"].ToString());
temp = (temp - 2732) / 10.0;
result.Add(new Temperature { CurrentValue = temp, InstanceName = obj["InstanceName"].ToString() });
}
return result;
}
}
}
}
更新25.06.2010:
(刚看到一个链接被发布到同一种解决方案上面...无论如何,我会离开这片的代码,如果有人要想让:-)使用它)
Answer 4:
有一个博客张贴关于如何做到这一点一些C#示例代码在这里 。
Answer 5:
这取决于您的计算机是否支持WMI
。 我的电脑不能太运行此WMI演示。
但是,我顺利拿到通过开放式硬件监控CPU温度。 添加在Visual Studio中Openhardwaremonitor参考。 它更容易。 试试这个
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();
}
}
}
}
你需要运行这个演示以管理员身份。
:你可以看到这里的教程http://www.lattepanda.com/topic-f11t3004.html
Answer 6:
我提取的CPU部分从打开硬件监控成分离的文库,露出传感器和部件通常隐藏到OHM。 它还包含了许多更新(像Ryzen和Xeon)的支持,因为在OHM他们不自2015年接受引入请求。
https://www.nuget.org/packages/HardwareProviders.CPU.Standard/
让我们知道你的意见:)
Answer 7:
它可以通过WMI代码来完成。 我发现微软的工具,为其创建的代码。
的WMI代码Creator工具允许生成的VBScript,C#,VB和.NET代码使用WMI完成管理任务,如查询管理数据,从WMI类执行的方法,或接收使用WMI事件通知。
您可以下载它在这里 。
Answer 8:
你可以给打开硬件监控一去,虽然它缺乏最新的处理器的支持。
internal sealed class CpuTemperatureReader : IDisposable
{
private readonly Computer _computer;
public CpuTemperatureReader()
{
_computer = new Computer { CPUEnabled = true };
_computer.Open();
}
public IReadOnlyDictionary<string, float> GetTemperaturesInCelsius()
{
var coreAndTemperature = new Dictionary<string, float>();
foreach (var hardware in _computer.Hardware)
{
hardware.Update(); //use hardware.Name to get CPU model
foreach (var sensor in hardware.Sensors)
{
if (sensor.SensorType == SensorType.Temperature && sensor.Value.HasValue)
coreAndTemperature.Add(sensor.Name, sensor.Value.Value);
}
}
return coreAndTemperature;
}
public void Dispose()
{
try
{
_computer.Close();
}
catch (Exception)
{
//ignore closing errors
}
}
}
请从拉链的官方消息 ,提取物和你的项目添加到OpenHardwareMonitorLib.dll参考。
文章来源: How to get CPU temperature?