¿Cómo obtener la temperatura de la CPU?

Necesito recostackr información de algún sistema para la aplicación que estoy desarrollando. La memoria disponible y la carga de la CPU son fáciles de obtener con C #. Desafortunadamente, la temperatura de la CPU no es tan fácil. He intentado usar WMI pero no pude obtener nada usando

Win32_TemperatureProbe 

o

 MSAcpi_ThermalZoneTemperature 

¿Alguien ya ha tratado con este problema? Me pregunto cómo los progtwigs de monitoreo, como SiSoftware Sandra, pueden obtener esa información …

En caso de que alguien esté interesado, aquí está el código de la clase:

 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; } } 

Estoy bastante seguro de que depende del fabricante, ya que se accederá a ellos a través de un puerto de E / S. Si tiene una placa específica con la que está tratando de trabajar, intente consultar los manuales y / o ponerse en contacto con el fabricante.

Si quieres hacer esto para una gran cantidad de tableros diferentes, te recomiendo contactar a alguien en algo así como SiSoftware o estar preparado para leer MUCHOS manuales de la placa base.

Como otra nota, no todas las placas tienen monitores de temperatura.

También podría tener problemas para obtener acceso privilegiado del kernel.

Para otros que puedan venir aquí, tal vez eche un vistazo a: http://openhardwaremonitor.org/

Sigue ese enlace y al principio podrías pensar: “hey, esa es una aplicación, por eso fue eliminada, la pregunta era cómo hacer esto desde el código C #, no para encontrar una aplicación que pueda decirme la temperatura …”. es donde muestra que no está dispuesto a invertir el tiempo suficiente para leer lo que también es “Open Hardware Monitor”.

También incluyen una interfaz de datos, aquí está la descripción:

Interfaz de datos El Open Hardware Monitor publica todos los datos del sensor en WMI (Windows Management Instrumentation). Esto permite que otras aplicaciones también lean y usen la información del sensor. Una documentación preliminar de la interfaz se puede encontrar aquí (clic) .

Cuando lo descarga, contiene la aplicación OpenHardwareMonitor.exe, no está buscando esa. También contiene OpenHardwareMonitorLib.dll, lo está buscando.

En su mayoría, si no es al 100%, es solo un envoltorio alrededor de la API de WinRing0, que puedes elegir para envolverte si te da la gana.

Lo he probado desde una aplicación C # y funciona. Aunque todavía está en beta, parecía bastante estable. También es de código abierto, por lo que podría ser un buen punto de partida.

Al final del día, me resulta difícil de creer que no esté en el tema de esta pregunta.

Sé que esta publicación es antigua, pero solo quería agregar un comentario si alguien debería mirar esta publicación e intentar encontrar una solución para este problema.

De hecho, puede leer la temperatura de la CPU muy fácilmente en C # utilizando un enfoque WMI.

Para obtener un valor Celsius, he creado un contenedor que convierte el valor devuelto por WMI y lo envuelve en un objeto fácil de usar.

Recuerde agregar una referencia a System.Management.dll en 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 Temperatures { get { List result = new List(); 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; } } } } 

Actualización 25.06.2010:

(Acabo de ver que se envió un enlace al mismo tipo de solución anterior … De todos modos, dejaré este fragmento de código si alguien quisiera usarlo :-))

Hay una publicación en el blog con algún código de muestra de C # sobre cómo hacerlo aquí .

Depende de si su computadora es compatible con WMI . Mi computadora no puede ejecutar esta demostración de WMI también.

Pero obtengo con éxito la temperatura de la CPU a través de Open Hardware Monitor. Agregue la referencia de Openhardwaremonitor en Visual Studio. Es mas fácil. Prueba esto

 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(); } } } } 

Necesita ejecutar esta demostración como administrador.

Puede ver el tutorial aquí: http://www.lattepanda.com/topic-f11t3004.html

Se puede hacer en tu código a través de WMI. Encontré una herramienta de Microsoft que crea código para ella.

La herramienta WMI Code Creator le permite generar código VBScript, C # y VB .NET que usa WMI para completar una tarea de administración, como consultar datos de gestión, ejecutar un método desde una clase WMI o recibir notificaciones de eventos mediante WMI.

Puedes descargarlo aquí .

Extraje la parte de la CPU de Open Hardware Monitor en una biblioteca separada, exponiendo sensores y miembros normalmente ocultos en OHM. También incluye muchas actualizaciones (como el soporte para Ryzen y Xeon) porque en OHM no aceptan solicitudes de extracción desde 2015.

https://www.nuget.org/packages/HardwareProviders.CPU.Standard/

Déjame saber tu opinión 🙂

Puede darle una oportunidad al Open Hardware Monitor, aunque carece de soporte para los últimos procesadores.

 internal sealed class CpuTemperatureReader : IDisposable { private readonly Computer _computer; public CpuTemperatureReader() { _computer = new Computer { CPUEnabled = true }; _computer.Open(); } public IReadOnlyDictionary GetTemperaturesInCelsius() { var coreAndTemperature = new Dictionary(); 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 } } } 

Descargue el archivo comprimido de la fuente oficial , extraiga y agregue una referencia a OpenHardwareMonitorLib.dll en su proyecto.