2012-08-01 19 views
5

是否有人知道我在哪裏可以找到任何最近使用C#中的OpenHardwareMonitor.dll的示例。 我試過一個簡單的實現,但無法獲得CPU溫度。我知道圖書館必須擁有它,因爲應用程序本身獲得了溫度。最近OpenHardwareMonitor示例代碼C#

我有一種感覺,你必須註冊事件才能閱讀某些東西,但我發現很難找到一個好例子。

Computer myComputer = new Computer(); 

      myComputer.Open(); 

      foreach (var hardwareItem in myComputer.Hardware) 
      { 

       if (hardwareItem.HardwareType == HardwareType.CPU) 
       { 
        foreach (var sensor in hardwareItem.Sensors) 
        { 
         if (sensor.SensorType == SensorType.Temperature) 
         { 
          Console.WriteLine(sensor.Value); 
         } 
        } 
       } 

      } 

任何想法或見解,將不勝感激。

回答

8

下面是我所知道的。我沒有更多時間花在它上面,所以我會把剩下的練習留給你。

我找不到任何文檔。代碼中甚至沒有XML註釋,所以我通過源代碼挖掘以獲得儘可能遠的效果。你將不得不這樣做。

你失蹤的第一件事是你必須在調用Computer.Open之前將Computer.CPUEnabled屬性設置爲true。這會導致Open添加一個CPU硬件設備。

你失蹤的第二件事是你必須致電Computer.Open

你失去的第三件事是你必須致電Hardware.Update讓它重新輪詢硬件。

您缺少的第四件事是傳感器值是Nullable<float>。你必須檢查那裏是否有一個有效的值。

這仍然不夠。儘管它現在輸出了四個溫度傳感器(在我的機器上),但從來沒有溫度值。

我挖通了設置,發現有這些長期的初始化項目的CPU和CPU的溫度。我添加了代碼將這些設置放入Computer(至少對於其中一個內核),但沒有任何效果。

什麼失敗是此調用IntelCpu.Update

Ring0.RdmsrTx(IA32_THERM_STATUS_MSR, out eax, out edx, 1UL << cpuid[i][0].Thread) 

這就是爲什麼我懷疑有一些初始化失蹤。

祝你好運!

using System; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.Windows.Forms; 
using OpenHardwareMonitor.Hardware; 

namespace WindowsFormsApplication1 
{ 
    public class MySettings : ISettings 
    { 
     private IDictionary<string, string> settings = new Dictionary<string, string>(); 

     public MySettings(IDictionary<string, string> settings) 
     { 
      this.settings = settings; 
     } 

     public bool Contains(string name) 
     { 
      return settings.ContainsKey(name); 
     } 

     public string GetValue(string name, string value) 
     { 
      string result; 
      if (settings.TryGetValue(name, out result)) 
       return result; 
      else 
       return value; 
     } 

     public void Remove(string name) 
     { 
      settings.Remove(name); 
     } 

     public void SetValue(string name, string value) 
     { 
      settings[name] = value; 
     } 
    } 

    public class Form1 : Form 
    { 
     Computer myComputer; 
     Timer timer = new Timer { Enabled = true, Interval = 1000 }; 

     public Form1() 
     { 
      timer.Tick += new EventHandler(timer_Tick); 

      MySettings settings = new MySettings(new Dictionary<string, string> 
      { 
       { "/intelcpu/0/temperature/0/values", "H4sIAAAAAAAEAOy9B2AcSZYlJi9tynt/SvVK1+B0oQiAYBMk2JBAEOzBiM3mkuwdaUcjKasqgcplVmVdZhZAzO2dvPfee++999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrIHz9+fB8/Iu6//MH37x79i9/+NX6N3/TJm9/5f/01fw1+fosnv+A/+OlfS37/jZ/s/Lpv9fff6Ml/NTef/yZPnozc5679b+i193//TQZ+/w2Dd+P9/sZeX/67v/GTf/b3iP3u4/ObBL//73+i+f039+D8Zk/+xz/e/P6beu2TQZju8yH8f6OgzcvPv/U3/Rb8+z/0f/9b/+yfaOn8079X6fr6Cws7ln/iHzNwflPv99/wyS/+xY4+v/evcJ+733+jJ5//Cw7/4ndy9Im3+U2e/Fbnrk31C93vrt/fyPvdb+N//hsF7/4/AQAA//9NLZZ8WAIAAA==" }, 
       { "/intelcpu/0/load/0/values", "H4sIAAAAAAAEAOy9B2AcSZYlJi9tynt/SvVK1+B0oQiAYBMk2JBAEOzBiM3mkuwdaUcjKasqgcplVmVdZhZAzO2dvPfee++999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrIHz9+fB8/Iu6//MH37x79i9++mpwcv/md/9df89egZ/xX/ym/5y/4D37618Lv7ya//u+58+u+5d9/z7/5t/w9/6u5fP5bH/6av+eTkXyefXxp26ONaf/v/dG/sf39D/rvnv4e5vc/0IP56/waK/vuHzf5I38P8/tv+mv8Rbb9f0pwTF9/zr/1X9vP/8I//+/6Pf7Z30N+/zdf/HX29zd/859q4aCNP5b//U+U3/+7f+zXOjZwfqvDX/V7/o9/vPz+a1G/pv0f+fGlhfk7eZ//N3/0v28//5X0u/n8Cxq7+f1X/tHft20A5x8a/W5/02+BP36Nf+j/nv8XfzrT+c2//Ob4p3+vktvUhNs/+xcWikP6e/4T/5jS5M8/sL8vP/5ff49f/Ivl9//sHzv6PX/vXyG//9R/94/9HuZ34P/5vyC//3W/5e/1exa/k+Bw4bUBnU2bP4Xg/1bn0uafeTH6PatfKL//N3/0t2y/gG9+/8+IzqYNxmU+/+jwX7afY67/nwAAAP//GYSA31gCAAA=" }, 
      }); 

      myComputer = new Computer(settings) { CPUEnabled = true }; 
      myComputer.Open(); 
     } 

     void timer_Tick(object sender, EventArgs e) 
     { 
      Trace.WriteLine(""); 
      foreach (var hardwareItem in myComputer.Hardware) 
      { 
       if (hardwareItem.HardwareType == HardwareType.CPU) 
       { 
        hardwareItem.Update(); 
        foreach (IHardware subHardware in hardwareItem.SubHardware) 
         subHardware.Update(); 

        foreach (var sensor in hardwareItem.Sensors) 
        { 
         if (sensor.SensorType == SensorType.Temperature) 
         { 
          Trace.WriteLine(String.Format("{0} Temperature = {1}", sensor.Name, sensor.Value.HasValue ? sensor.Value.Value.ToString() : "no value")); 
         } 
        } 
       } 
      } 
     } 
    } 
} 
+1

你們是神的禮物給程序員先生...... – 2012-08-02 01:56:48

+0

你願意就如何找出一個外國庫中的任何提示嗎?任何方便的第三方工具? Thx雖然適合你的時間,但我認爲這篇文章會引起很多人的興趣。 – 2012-08-02 02:41:43

+1

@JoshElias只要閱讀源代碼,它的開源代碼:http://code.google.com/p/open-hardware-monitor/source/browse/#svn/trunk – Tergiver 2012-08-02 16:28:42

5

道歉沒有添加此作爲以前的答案的評論,但我沒有足夠的聲譽。

只是櫃面任何人碰到這個像我一樣,有同樣的問題,我已經找到了解決問題的方法不是所有的CPU信息,只需在運行Visual Studio /擁有管理權限的已編譯的程序顯示。

似乎都需要得到CPU信息的底層API調用是不可能沒有管理權限,但沒有顯示錯誤。