2

在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 跳过它。尝试了这么多示例示例无法弄清楚如何使其工作。而且我确定我的视频卡支持它,因为如果我运行 origiran openhardwaremonitor 程序 ikts 会如何处理所有参数,如温度和速度......

刚刚从程序官网下载了openhwardwaremonitor.dll文件:

http://openhardwaremonitor.org/downloads/ 该dll位于它自己的程序目录中。

4

1 回答 1

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每次都枚举集合。

希望这可以帮助!

于 2012-07-31T21:50:18.843 回答