web-dev-qa-db-ja.com

CPU温度を取得する方法は?

開発中のアプリケーションのシステム情報を収集する必要があります。使用可能なメモリと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;
    }
}
54
yeyeyerman

I/Oポートを介してアクセスされるため、メーカーに依存していると確信しています。特定のボードを使用している場合は、マニュアルを確認するか、製造元に問い合わせてください。

多くの異なるボードでこれを行いたい場合は、SiSoftwareのような人に連絡するか、マザーボードのマニュアルをたくさん読む準備をしておくことをお勧めします。

別の注意として、すべてのボードに温度モニターがあるわけではありません。

また、カーネルから特権アクセスを取得する際に問題が発生する場合があります。

19
samoz

ここに来るかもしれない他の人のために、多分見てみてください: http://openhardwaremonitor.org/

そのリンクをたどると、最初は「ちょっとそれがアプリケーションだから、それが削除されたので、温度を教えてくれるアプリケーションを見つけるのではなく、C#コードからこれを行う方法が問題だった...」と思うかもしれません。 「ハードウェアモニターを開く」とは何かを読むのに十分な時間を投資する気がないことを示しています。

また、データインターフェイスも含まれています。説明を次に示します。

データインターフェイスOpen Hardware Monitorは、すべてのセンサーデータをWMI(Windows Management Instrumentation)に公開します。これにより、他のアプリケーションもセンサー情報を読み取って使用できます。インターフェイスの予備的なドキュメントは here(click) にあります。

ダウンロードすると、OpenHardwareMonitor.exeアプリケーションが含まれていますが、探しているわけではありません。また、OpenHardwareMonitorLib.dllも含まれています。これを探しています。

ほとんどの場合、100%ではありませんが、WinRing0 APIの単なるラッパーです。WinRing0APIは、必要に応じて自分自身をラップすることもできます。

私は自分でC#アプリからこれを試してみましたが、動作します。まだベータ版ですが、かなり安定しているように見えました。また、オープンソースであるため、代わりに適切な出発点になる可能性があります。

結局のところ、私はそれがこの質問のテーマになっていないと信じることは難しいと思います。

55
Jens

私はこの投稿が古いことを知っていますが、誰かがこの投稿を見て、この問題の解決策を見つけようとするなら、コメントを追加したかっただけです。

実際、C#では、WMIアプローチを使用してCPU温度を非常に簡単に読み取ることができます。

摂氏値を取得するために、WMIによって返された値を変換し、使いやすいオブジェクトにラップするラッパーを作成しました。

Visual StudioでSystem.Management.dllへの参照を追加することを忘れないでください。

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;

            }
        }
    }
}

2010年6月25日更新:

(リンクが上記と同じ種類のソリューションに投稿されたことをただ見ました...とにかく、誰かがそれを使いたいなら、私はこのコードを残します:-))

31
Lasse Rasch

CPU部分をOpen Hardware Monitorから別のライブラリに抽出し、通常はOHMに隠れているセンサーとメンバーを公開しました。また、OHMでは2015年以降プル要求を受け付けないため、多くの更新(RyzenおよびXeonのサポートなど)も含まれています。

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

あなたの意見を聞かせてください:)

3
TheQult

Open Hardware Monitorを試してみることができますが、最新のプロセッサをサポートしていません。

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

公式ソース からZipをダウンロードし、プロジェクト内のOpenHardwareMonitorLib.dllへの参照を抽出して追加します。

3
Ali Zahid

コンピューターがWMIをサポートしているかどうかによります。私のコンピューターでもこのWMIデモを実行できません。

しかし、Open Hardware Monitorを介して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

2
haoming weng

方法についてのC#サンプルコードを含むブログ投稿があります here

2
Jon Grant

WMIを介してコードで実行できます。コードを作成するMicrosoftのツールを見つけました。

WMI Code Creatorツールを使用すると、VBScript、C#、およびVB .NETコードを生成し、WMIを使用して、管理データのクエリ、WMIクラスからのメソッドの実行、または、WMIを使用してイベント通知を受信します。

ダウンロードできます こちら

1
Jet