首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >最近的OpenHardwareMonitor示例代码C#

最近的OpenHardwareMonitor示例代码C#
EN

Stack Overflow用户
提问于 2012-08-02 02:19:53
回答 2查看 7.2K关注 0票数 5

谁知道我在哪里可以找到在C#中使用OpenHardwareMonitor.dll的最新示例。我尝试了一个简单的实现,但无法获得cpu Temp。我知道库中一定有它,因为应用程序本身会获取温度。

我有一种感觉,你必须注册事件才能获得某些东西的读数,但我发现很难找到一个好的例子。

代码语言:javascript
复制
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);
                        }
                    }
                }

            }

任何想法或见解都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-02 05:52:33

下面是我得到的所有信息。我没有更多的时间花在这上面,所以我把剩下的调查工作留给你。

我找不到任何文档。代码中甚至没有XML注释,所以我仔细研究了源代码才得到了尽可能多的结果。你将不得不做同样的事情。

您遗漏的第一件事是在调用Computer.Open之前必须将Computer.CPUEnabled属性设置为true。这会导致Open添加CPU硬件设备。

您遗漏的第二件事是您必须调用Computer.Open

您遗漏的第三件事是,您必须调用Hardware.Update来让它重新轮询硬件。

您遗漏的第四件事是传感器的值是一个Nullable<float>。您必须检查那里是否存在有效的值。

这仍然不够。虽然它现在输出了四个温度传感器(在我的机器上),但从来没有温度值。

我深入研究了这些设置,发现cpu和cpu温度都有很长的初始化项。我添加了代码来将这些设置放入Computer (至少对于一个内核),但它没有任何效果。

失败的是IntelCpu.Update中的这个调用

代码语言:javascript
复制
Ring0.RdmsrTx(IA32_THERM_STATUS_MSR, out eax, out edx, 1UL << cpuid[i][0].Thread)

这就是为什么我怀疑有一些初始化缺失。

祝好运!

代码语言:javascript
复制
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"));
                        }
                    }
                }
            }
        }
    }
}
票数 10
EN

Stack Overflow用户

发布于 2014-02-15 09:39:34

很抱歉没有添加这条评论作为上一个答案的评论,但我没有足够的声誉。

只是为了防止其他人像我一样遇到同样的问题,我找到了一个解决方案,通过简单地运行具有管理权限的Visual Studio /the编译程序来解决这个问题,而不是显示所有的CPU信息。

似乎在没有管理权限的情况下,获取CPU信息所需的低级API调用是不可能的,但没有显示错误。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11765192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档