Recent OpenHardwareMonitor Sample Code C#
Asked Answered
P

2

5

Does anybody know where I can find any recent samples for using OpenHardwareMonitor.dll in C#. I've tried a simple implementation but cannot get the cpu Temp. I know the library must have it since the app itself gets the temperature.

I have a feeling you have to register events to get readings on certain things but I'm finding it difficult to find a good example.

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

            }

Any thoughts or insight would be appreciated.

Philis answered 1/8, 2012 at 18:19 Comment(0)
C
10

Below is as far as I got. I don't have more time to spend on it, so I'll leave the rest of the sleuthing to you.

I couldn't find any documentation whatsoever. There are not even XML comments in the code, so I dug through the source code to get as far as I did. You're going to have to do the same.

The first thing you're missing is that you have to set the Computer.CPUEnabled property to true before you call Computer.Open. This causes Open to add a CPU hardware device.

The second thing you're missing is that you have to call Computer.Open.

The third thing you're missing is that you have to call Hardware.Update to get it to re-poll the hardware.

The fourth thing you're missing is that the sensor value is a Nullable<float>. You have to check that there is a valid value there.

This still isn't enough. Although it now outputs four temperature sensors (on my machine), there never is a temperature value.

I dug through the settings and found that there are these long initialization items for the cpu and cpu's temperature. I added code to put those settings into the Computer (at least for one of the cores), but it didn't have any effect.

What is failing is this call in IntelCpu.Update

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

That's why I suspect there is some initialization missing.

Good Luck!

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"));
                        }
                    }
                }
            }
        }
    }
}
Costanzo answered 1/8, 2012 at 21:52 Comment(3)
Would you be willing to give any tips on how to figure out a foreign library? Any handy third party tools? Thx for your time though, I think this post will be of interest to many people.Philis
@JoshElias Just read the source code, it's open source: code.google.com/p/open-hardware-monitor/source/browse/#svn/…Costanzo
@Costanzo Using this code Getting Temperature value as null in windows service, for the console app, it is working fine. Please Help me.Pharmacopsychosis
W
7

Apologies for not adding this as a comment for the previous answer but I don't have enough reputation.

Just incase anyone else bumps into this like I did and has the same problem, I have found a solution to the problem not all CPU info displaying by simply running Visual Studio /the compiled program with administrative rights.

It seems the low level API calls that are needed to get the CPU information is not possible without administrative rights, but no error is displayed.

Weft answered 15/2, 2014 at 1:39 Comment(1)
That was it for me. No magic initialization settings from @Costanzo required.Borneo

© 2022 - 2024 — McMap. All rights reserved.