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ジャンプすることは決してありません。非常に多くのサンプルを試してみましたが、どのように機能するのかわかりません。そして、元のopenhardwaremonitorプログラムを実行している場合、温度や速度などのすべてのパラメーターを監視しているため、ビデオカードがそれをサポートしていることを確認してください...

プログラムの公式 Web サイトから 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 フォーム アプリからそのコードを実行すると、現在の温度が表示されます (38 ℃ は、明らかに十分に実行していないことを意味します)。

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.Timer、クラスがあります。Computer5 秒ごとに、tickイベントが発生し、ハードウェアが列挙され、現在の温度を含むメッセージ ボックスが表示されます。これは簡単にラベルにすることができ、毎回コレクションSensorを列挙することを避けるためにクラス レベル変数に格納することもできます。IHardware

お役に立てれば!

于 2012-07-31T21:50:18.843 に答える