在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位于程序目录中。
答案 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.Timer
和Computer
类作为我们在构造函数中初始化的类级变量。每隔5秒,tick
事件将触发,枚举硬件,并显示一个当前临时输入的消息框。这很容易成为标签,甚至可以将Sensor
存储在一个类中级别变量,以避免每次枚举IHardware
集合。
希望这有帮助!