2012-08-01 8 views
5

Weiß jemand, wo ich alle aktuellen Beispiele für die Verwendung von OpenHardwareMonitor.dll in C# finden kann. Ich habe eine einfache Implementierung versucht, kann aber nicht die CPU Temp. Ich weiß, dass die Bibliothek es haben muss, da die App selbst die Temperatur bekommt.Aktuelle OpenHardwareMonitor Beispielcode C#

Ich habe das Gefühl, dass Sie Ereignisse registrieren müssen, um Messwerte zu bestimmten Dingen zu bekommen, aber ich finde es schwierig, ein gutes Beispiel zu finden.

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

      } 

Alle Gedanken oder Einblicke würden geschätzt.

Antwort

8

Unten ist so weit wie ich habe. Ich habe nicht mehr Zeit dafür, also überlasse ich dir den Rest der Nachforschungen.

Ich konnte keine Dokumentation überhaupt finden. Es gibt nicht einmal XML-Kommentare im Code, also habe ich den Quellcode durchforstet, um so weit wie möglich zu kommen. Du wirst dasselbe tun müssen.

Das erste, was Sie vermissen, ist, dass Sie die Computer.CPUEnabled Eigenschaft auf True setzen müssen, bevor Sie Computer.Open anrufen. Dies bewirkt, dass Open ein CPU-Hardwaregerät hinzufügt.

Die zweite Sache, die Sie vermissen, ist, dass Sie Computer.Open anrufen müssen.

Die dritte Sache, die Sie vermissen, ist, dass Sie Hardware.Update aufrufen müssen, damit es die Hardware neu abfragt.

Die vierte Sache, die Sie verpassen, ist, dass der Sensorwert ein Nullable<float> ist. Sie müssen prüfen, ob dort ein gültiger Wert vorhanden ist.

Das ist immer noch nicht genug. Obwohl es jetzt vier Temperatursensoren (an meiner Maschine) gibt, gibt es nie einen Temperaturwert.

Ich durchforstete die Einstellungen und fand, dass es diese langen Initialisierungspunkte für die CPU- und CPU-Temperatur gibt. Ich habe Code hinzugefügt, um diese Einstellungen in die Computer (zumindest für einen der Kerne) zu setzen, aber es hatte keine Wirkung.

Was ist dieser Aufruf IntelCpu.Update versagt

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

Deshalb habe ich es vermute, einige fehlende Initialisierung.

Viel Glück!

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

Sie sind Götter Geschenk an Programmierer Sir ... –

+0

Wären Sie bereit, irgendwelche Tipps geben, wie man eine ausländische Bibliothek herausfinden? Irgendwelche handlichen Werkzeuge von Drittanbietern? Aber für Ihre Zeit denke ich, dass dieser Beitrag für viele Leute von Interesse sein wird. –

+1

@JoshElias Nur den Quellcode lesen, es ist Open Source: http://code.google.com/p/open-hardware-monitor/source/browse/#svn/trunk – Tergiver

5

Entschuldigung dafür, dies nicht als Kommentar für die vorherige Antwort hinzuzufügen, aber ich habe nicht genug Ansehen.

Nur wenn irgendjemand sonst wie ich in dieses stößt und das gleiche Problem hat, habe ich eine Lösung für das Problem gefunden, nicht alle CPU-Informationen durch einfaches Ausführen von Visual Studio/das kompilierte Programm mit Administratorrechten angezeigt.

Es scheint, dass die Low-Level-API-Aufrufe, die benötigt werden, um die CPU-Informationen zu erhalten, ohne Administratorrechte nicht möglich ist, aber kein Fehler angezeigt wird.