1. 程式人生 > >C# 獲取CPU 溫度 的兩種方式

C# 獲取CPU 溫度 的兩種方式

上次接手了一個需要對伺服器的檢測系統軟體,但是在獲取CPU溫度的時候總是出問題,查找了很多的資料,總結了以下兩種方法,是比較常見的

//第一種方法 就是傳統的 wimi 方式獲取 ,需要引進一個名稱空間  using System.Management;

 public static void GetCPUTemperature()
        {
            string str = "";

            ManagementObjectSearcher vManagementObjectSearcher = new ManagementObjectSearcher(@"root\WMI", @"select * from MSAcpi_ThermalZoneTemperature");

            foreach (ManagementObject managementObject in vManagementObjectSearcher.Get())
            {
                str += managementObject.Properties["CurrentTemperature"].Value.ToString();
            }

             //這就是CPU的溫度了
            float temp = (float.Parse(str) - 2732) / 10;

           
        }

這種方式往往跟伺服器本身的硬體配置是有關係的,可能會在 foreach (ManagementObject managementObject in vManagementObjectSearcher.Get()) 這一行程式碼報錯

解決方案一:用管理員身份執行你的專案  (如果還是有錯的話,那就使用第二種方式吧)

///第二種方法 據說是非wimi方式,好像是通過虛擬硬碟讀取的(沒看太懂)(也是要以管理員身份執行這個軟體)

這個方法需要引進一些現有的開源類庫(OpenHardwareMonitor.csproj,OpenHardwareMonitorLib.csproj)

   這種方法是借鑑別人的,是一個OpenHardwareMonitor的開源檢測軟體,有原始碼和使用方法

 Open Hardware Monitor可以支援大部分常見的主機板晶片與硬體元件,監控包含主機板、CPU、硬碟、顯示卡、裝置的電壓、溫度、風扇轉速與運作頻率、負載等資訊。

使用方法:將庫新增至專案中(就是將你下載的專案原始碼放你的專案裡邊或者是引用編譯好的dll 檔案)
 
宣告:
 
PersistentSettings settings =new PersistentSettings();
 
UpdateVisitor updateVisitor = new UpdateVisitor();
 
初始化config配置檔案,詳情見Bin目錄Debug/Replase\OpenHardwareMonitor.config檔案
 

//Application 的名稱空間是 System.Windows.Forms; 別引用錯了
settings.Load(Path.ChangeExtension(
 Application.ExecutablePath, ".config"));
 
初始化Computer物件
 
Computer computer= new Computer(settings);
 
呼叫open方法,這個方法一定要開啟
 
conputer.open();
 
獲取cpu溫度:
 
                 StringBuilder str = new StringBuilder();
 
               computer.Accept(updateVisitor);
                 for (int i = 0; i < computer.Hardware.Length; i++)
                 {
 
                    //迴圈找到HardwareType為cpu
                     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)
                             {
 
                             //獲取到cpu核心
                               str.Append(computer.Hardware[i].Sensors[j].Name);
                               str.Append("\t");
 
                              //這裡就是cpu溫度了
                               str.Append(computer.Hardware[i].Sensors[j].Value.ToString());
                               str.Append("\n");
                             }
                         }
                     }
                 }
 
Console.WriteLine(str.ToString());