2012-08-01 29 views
5

¿Alguien sabe dónde puedo encontrar muestras recientes para usar OpenHardwareMonitor.dll en C#. He intentado una implementación simple pero no puedo obtener la CPU Temp. Sé que la biblioteca debe tenerlo ya que la aplicación recibe la temperatura.Código de ejemplo reciente de OpenHardwareMonitor C#

Tengo la sensación de que tiene que registrar eventos para obtener lecturas sobre ciertas cosas, pero me resulta difícil encontrar un buen ejemplo.

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

      } 

Cualquier pensamiento o idea sería apreciada.

Respuesta

8

Debajo está tan lejos como llegué. No tengo más tiempo para gastar en él, así que te dejaré el resto de la investigación.

No he encontrado ninguna documentación de ningún tipo. Ni siquiera hay comentarios XML en el código, así que busqué en el código fuente para llegar tan lejos como lo hice. Tendrás que hacer lo mismo.

Lo primero que falta es que tiene que establecer la propiedad Computer.CPUEnabled en verdadero antes de llamar al Computer.Open. Esto hace que Open agregue un dispositivo de hardware de CPU.

Lo segundo que te falta es que tienes que llamar al Computer.Open.

La tercera cosa que te falta es que tienes que llamar al Hardware.Update para que vuelva a sondear el hardware.

Lo cuarto que falta es que el valor del sensor es Nullable<float>. Debes verificar que haya un valor válido allí.

Esto todavía no es suficiente. Aunque ahora produce cuatro sensores de temperatura (en mi máquina), nunca hay un valor de temperatura.

Exploré a través de la configuración y encontré que hay estos elementos de inicialización largos para la temperatura de la CPU y la CPU. Agregué el código para poner esas configuraciones en el Computer (al menos para uno de los núcleos), pero no tuvo ningún efecto.

Lo que está fallando es esta llamada en IntelCpu.Update

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

Por eso sospecho que hay algo de inicialización faltante.

¡Buena suerte!

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

Usted es un regalo de Dios para los programadores señor ... –

+0

¿Estaría dispuesto a dar algún consejo sobre cómo encontrar una biblioteca extranjera? ¿Alguna herramienta útil de terceros? Sin embargo, por su tiempo, creo que esta publicación será de interés para muchas personas. –

+1

@JoshElias Solo lea el código fuente, es de código abierto: http://code.google.com/p/open-hardware-monitor/source/browse/#svn/trunk – Tergiver

5

Disculpa por no agregar esto como un comentario para la respuesta anterior, pero no tengo suficiente reputación.

Por si alguien más se topa con esto como yo y tiene el mismo problema, he encontrado una solución para el problema, no toda la información de la CPU se muestra simplemente ejecutando Visual Studio/el programa compilado con derechos administrativos.

Parece que las llamadas de bajo nivel API que se necesitan para obtener la información de la CPU no son posibles sin derechos administrativos, pero no se muestra ningún error.