我试图使用OpenHardwareMonitor源代码,但从来没有得到我的视频卡温度可能是错的?

时间:2012-07-31 21:30:39

标签: c#

在form1中我做了:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Management;
using OpenHardwareMonitor.Hardware;

namespace NvidiaTemp
{
    public partial class Form1 : Form
    {
        Computer computer = new Computer();
        public Form1()
        {
            InitializeComponent();

            computer.Open();
            var temps = new List<decimal>();
            foreach (var hardware in computer.Hardware)
            {
                if (hardware.HardwareType != HardwareType.CPU)
                    continue;
                hardware.Update();
                foreach (var sensor in hardware.Sensors)
                {
                    if (sensor.SensorType != SensorType.Temperature)
                    {
                        if (sensor.Value != null)
                            temps.Add((decimal)sensor.Value);
                    }
                }
            }

            foreach (decimal temp in temps)
            {
                Console.WriteLine(temp);
                MessageBox.Show(temp.ToString());
            }
            Console.ReadLine();




        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }
}

它永远不会进入foreach跳过它。 尝试了这么多样本的例子,无法弄清楚如何让它发挥作用。并且我确定我的视频卡支持它,因为如果我运行原始openhardwaremonitor程序ikts howing所有参数,如temepratures和速度......

刚刚从官方计划网站下载了openhwardwaremonitor.dll文件:

http://openhardwaremonitor.org/downloads/ dll位于程序目录中。

1 个答案:

答案 0 :(得分:3)

我打破了ILSpy并查看了下载附带的示例exe文件,因为文档非常简陋 - 通常情况如下: - )

我注意到初始化Computer对象时,像GPUEnabled这样的布尔属性设置为true。

因此...

Computer myComputer = new Computer();

myComputer.Open();

myComputer.GPUEnabled = true; //This is the line you are missing.

foreach (var hardwareItem in myComputer.Hardware)
{

    if (hardwareItem.HardwareType == HardwareType.GpuNvidia)
    {
        foreach (var sensor in hardwareItem.Sensors)
        {
            if (sensor.SensorType == SensorType.Temperature)
            {
                MessageBox.Show(String.Format("The current temperature is {0}", sensor.Value));
            }
        }
    }

}

当我从我的机器上的Windows窗体应用程序运行该代码时,我得到当前的温度(38C,这意味着我显然没有足够的运行它!)

如果我没有设置GPUEnabled,我会得到与您完全相同的结果 - IHardware集合中没有任何项目。

<强>更新

要回答您在评论中提出的其他问题,以下示例应该对您有用:

    Timer timer;

    Computer myComputer;

    public Form1()
    {

        InitializeComponent();



        myComputer = new Computer();

        myComputer.Open();

        myComputer.GPUEnabled = true;

        timer = new Timer();
        timer.Interval = 5000;
        timer.Tick += new EventHandler(timer_Tick);
        timer.Start();

     }

    void timer_Tick(object sender, EventArgs e)
    {
        foreach (var hardwareItem in myComputer.Hardware)
        {

            if (hardwareItem.HardwareType == HardwareType.GpuNvidia)
            {
                foreach (var sensor in hardwareItem.Sensors)
                {
                    if (sensor.SensorType == SensorType.Temperature)
                    {
                        MessageBox.Show(String.Format("The current temperature is {0}", sensor.Value));
                    }
                }
            }

        }
    }

这里我们有一个Windows.Forms.TimerComputer类作为我们在构造函数中初始化的类级变量。每隔5秒,tick事件将触发,枚举硬件,并显示一个当前临时输入的消息框。这很容易成为标签,甚至可以将Sensor存储在一个类中级别变量,以避免每次枚举IHardware集合。

希望这有帮助!