Comment obtenir la température du processeur?

J'ai besoin de rassembler des informations sur le système pour l'application que je développe. La mémoire disponible et la charge du processeur sont faciles à obtenir en utilisant C#. Malheureusement, la température du processeur ce n'est pas si facile. J'ai essayé D'utiliser WMI mais je n'ai rien pu obtenir en utilisant

Win32_TemperatureProbe

Ou

MSAcpi_ThermalZoneTemperature

Quelqu'un a-t-il déjà traité de cette question? Je me demande comment les programmes de surveillance, comme SiSoftware Sandra, peuvent obtenir cette information...

Juste au cas où quelqu'un serait intéressé, voici le code de la classe:

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;
    }
}
49
demandé sur yeyeyerman 2009-07-28 20:03:50

8 réponses

Je suis sûr que cela dépend du fabricant, car ils seront accessibles via un port d'E/S. Si vous avez une carte spécifique avec laquelle vous essayez de travailler, essayez de consulter les manuels et / ou de contacter le fabricant.

Si vous voulez faire cela pour beaucoup de cartes différentes, je vous recommande de contacter quelqu'un à quelque chose comme SiSoftware OU être prêt à lire beaucoup de manuels de carte mère.

Comme une autre note, pas tous les conseils ont des moniteurs de température.

Vous aussi peut rencontrer des problèmes pour obtenir un accès privilégié du noyau.

19
répondu samoz 2015-02-12 17:50:55

Pour les autres qui peuvent venir ici, peut-être jeter un oeil à: http://openhardwaremonitor.org/

Suivez ce lien et au début, vous pourriez penser, " hey c'est une Application, c'est pourquoi il a été supprimé, la question était de savoir comment faire cela à partir du code C#, de ne pas trouver une application qui peut me dire la température..."C'est là qu'il montre que vous n'êtes pas prêt à investir suffisamment de temps dans la lecture de ce que "Open Hardware Monitor" est également.

Ils comprennent également une donnée Interface, voici la description:

Interface De Données Le moniteur matériel ouvert publie toutes les données du capteur WMI (Windows Management Instrumentation). Cela permet à d'autres applications pour lire et utiliser les informations du capteur ainsi. Un la documentation préliminaire de l'interface peut être trouvée ici (cliquez sur) .

Lorsque vous le Téléchargez, il contient L'OpenHardwareMonitor.application exe, vous ne cherchez pas celui-là. Il contient également de la OpenHardwareMonitorLib.dll, vous êtes à la recherche pour que l'on.

C'est surtout, sinon 100%, juste un wrapper autour de L'API WinRing0, que vous pouvez choisir d'envelopper vous-même si vous en avez envie.

J'ai essayé cela à partir d'une application C# moi-même, et cela fonctionne. Bien qu'il soit encore en version bêta, il semblait plutôt stable. Il est également open source donc il pourrait être un bon point de départ à la place.

À la fin de la journée j'ai du mal à croire que c'est pas sur le sujet de cette question.

50
répondu Jens 2016-06-07 11:28:09

Je sais que ce post est vieux, mais je voulais juste ajouter un commentaire si quelqu'un devrait regarder ce post et essayer de trouver une solution à ce problème.

Vous pouvez en effet Lire la température du processeur très facilement en C# en utilisant une approche WMI.

Pour obtenir une valeur Celsius, j'ai créé un wrapper qui convertit la valeur renvoyée par WMI et l'enveloppe en un objet facile à utiliser.

N'oubliez pas d'ajouter une référence au System.Management.dll Dans 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;

            }
        }
    }
}

Mise à jour 25.06.2010:

(juste vu qu'un lien a été posté vers le même type de solution ci-dessus... Quoi qu'il en soit, je vais laisser ce morceau de code si quelqu'un devrait vouloir l'utiliser: -))

30
répondu Lasse Rasch 2015-02-12 17:58:28

Il y a un article de blog avec un exemple de code C# sur la façon de le faire ici .

3
répondu Jon Grant 2009-07-28 16:13:38

Cela dépend si votre ordinateur prend en charge WMI. Mon ordinateur ne peut pas exécuter cette démo WMI aussi.

Mais j'obtiens avec succès la température du processeur via un moniteur matériel ouvert. Ajoutez la référence Openhardwaremonitor dans Visual Studio. C'est plus facile. Essayez ceci

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

, Vous devez exécuter cette démo en tant qu'administrateur.

Vous pouvez voir le tutoriel ici: http://www.lattepanda.com/topic-f11t3004.html

2
répondu haoming weng 2018-02-02 02:54:00

Cela peut être fait dans votre code via WMI. J'ai trouvé un outil de Microsoft qui crée du code pour cela.

L'outil WMI Code Creator vous permet de générer VBScript, C# et VB Code. net qui utilise WMI pour effectuer une tâche de gestion telle que l'interrogation pour les données de gestion, exécuter une méthode à partir D'une classe WMI ou recevoir notifications d'événements à L'aide de WMI.

Vous pouvez le télécharger ici.

1
répondu Jet 2013-03-09 08:41:11

J'ai extrait la partie CPU du moniteur matériel ouvert dans une bibliothèque séparée, exposant les capteurs et les membres normalement cachés dans OHM. Il inclut également de nombreuses mises à jour (comme le support de Ryzen et Xeon) car sur OHM, ils n'acceptent pas les demandes de tirage depuis 2015.

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

Faites connaître votre opinion:)

0
répondu TheQult 2018-06-05 10:40:15

Vous pouvez essayer le moniteur matériel ouvert, bien qu'il manque de support pour les derniers processeurs.

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

Téléchargez le zip depuis la source officielle , Extrayez et ajoutez une référence à OpenHardwareMonitorLib.dll dans votre projet.

0
répondu Ali Zahid 2018-08-08 06:56:54