C#用OpenHardwareMonitor读显卡温度为什么都说可以用,但是一只是卡在computer.Open();这一直找不到系统文件,有什么办法能解决嘛,源码网上找的
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WinFormsApp1.Homepagme;
using OpenHardwareMonitor.Hardware;
using System.Threading;
namespace WinFormsApp1
{
public partial class ceshi : Form
{
public class UpdateVisitor : IVisitor
{
public void VisitComputer(IComputer computer)
{
computer.Traverse(this);
}
public void VisitHardware(IHardware hardware)
{
hardware.Update();
foreach (IHardware subHardware in hardware.SubHardware)
subHardware.Accept(this);
}
public void VisitSensor(ISensor sensor) { }
public void VisitParameter(IParameter parameter) { }
}
public class GetCPUTemp
{
public static int GetTemp()
{
//注意,必须以管理员身份运行方可。hhd只有已用空间一项,mainboard没有传感器。cpu温度
UpdateVisitor updateVisitor = new UpdateVisitor();
Computer computer = new Computer();
computer.Open();
computer.CPUEnabled = true;
// computer.MainboardEnabled = true;
// computer.HDDEnabled = true;
computer.Accept(updateVisitor);
int temperature = 0;
for (int i = 0; i < computer.Hardware.Length; i++)
{
//查找硬件类型为CPU
if (computer.Hardware[i].HardwareType == HardwareType.CPU)
{
for (int j = 0; j < computer.Hardware[i].Sensors.Length; j++)
{
string str = computer.Hardware[i].Sensors.ToString();
int k = 0;
if (computer.Hardware[i].Sensors[j].SensorType == SensorType.Temperature && computer.Hardware[i].Sensors[j].Name == "CPU Core # 1")
{
temperature = Convert.ToInt32(computer.Hardware[i].Sensors[j].Value);
}
}
}
}
return temperature;
}
}
private List<Image> images = new List
();
public ceshi()
{
InitializeComponent();
while (true)
{
label2.Text = GetCPUTemp.GetTemp().ToString();
Thread.Sleep(1000);
}
}
}
异常文本
System.MissingMethodException: Method not found: 'System.Threading.Mutex System.Threading.Mutex.OpenExisting(System.String, System.Security.AccessControl.MutexRights)'.
at OpenHardwareMonitor.Hardware.Ring0.Open()
at OpenHardwareMonitor.Hardware.Computer.Open()
at WinFormsApp1.ceshi.GetCPUTemp.GetTemp() in D:\桌面\vs\WinFormsApp1\WinFormsApp1\ceshi.cs:line 48
at WinFormsApp1.ceshi..ctor() in D:\桌面\vs\WinFormsApp1\WinFormsApp1\ceshi.cs:line 105
at WinFormsApp1.index.button4_Click(Object sender, EventArgs e) in D:\桌面\vs\WinFormsApp1\WinFormsApp1\index.cs:line 159
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, WM msg, IntPtr wparam, IntPtr lparam)
你的代码没大毛病,测试了nuget上2个版本的dll,都是可以的;显然2021年的OpenHardwareMonitor.0.9.6更科学;
另外你的那个判断Name多余。
版本1:OpenHardwareMonitorLibCore.1.0.2
版本2、nuget的 OpenHardwareMonitor.0.9.6
这是测试代码,添加nuget引用就能跑了。
internal class Program
{
public static void Main(string[] args)
{
var updateVisitor = new UpdateVisitor();
var computer = new Computer();
computer.Open();
computer.CPUEnabled = true; //这个很关键
computer.Accept(updateVisitor);
for (int i = 0; i < computer.Hardware.Length; i++)
{
//查找硬件类型为CPU
if (computer.Hardware[i].HardwareType == HardwareType.CPU)
{
for (int j = 0; j < computer.Hardware[i].Sensors.Length; j++)
{
var iSensor = computer.Hardware[i].Sensors[j];
Console.WriteLine($"{iSensor.SensorType},{iSensor.Name},{iSensor.Value}");
//找到温度传感器
if (iSensor.SensorType == SensorType.Temperature)
{
var v = iSensor.Value.ToString();
Console.WriteLine(v);
}
}
}
}
}
}
public class UpdateVisitor : IVisitor
{
public void VisitComputer(IComputer computer)
{
computer.Traverse(this);
}
public void VisitHardware(IHardware hardware)
{
hardware.Update();
foreach (var subHardware in hardware.SubHardware)
subHardware.Accept(this);
}
public void VisitSensor(ISensor sensor)
{
}
public void VisitParameter(IParameter parameter)
{
}
}
引用System.Threading.dll试试
最新试到Ring0.open报错了,我只想跳过不用读CPU也可以了,我只想要显卡的温度之类的信息和硬盘
在使用 OpenHardwareMonitor 库时,可能遇到了无法访问系统文件的问题。这通常是因为程序没有足够的权限来访问该文件,或者该文件被其他程序占用而无法访问。下面是几种可能的解决方法:
1.确保您的程序以管理员身份运行:在运行程序之前,以管理员身份启动 Visual Studio 或程序本身,以获得足够的权限来访问系统文件。
2.禁用防病毒软件或添加程序到白名单中:有些防病毒软件可能会阻止程序访问系统文件。您可以尝试禁用防病毒软件或将程序添加到防病毒软件的白名单中。
3.确认 OpenHardwareMonitor 已正确安装:请确保您已正确安装 OpenHardwareMonitor 库,并且库文件存在于正确的目录中。您可以在代码中使用完整的文件路径来打开文件,以确保文件路径正确。
4.确认系统中存在所需的文件:请确认在使用 OpenHardwareMonitor 库之前,您已经安装了与库兼容的操作系统版本,并且所需的文件已正确安装在系统中。
5.使用其他库或API:如果您无法解决该问题,您可以尝试使用其他的硬件监控库或API,例如 WMI(Windows Management Instrumentation)或 Open Hardware Monitor WMI Provider。
引用chatGPT作答,根据您提供的代码和异常信息,可能是由于OpenHardwareMonitor库在运行时未能找到必需的系统方法或库,导致引发了缺少方法的异常。
要解决这个问题,可以尝试以下步骤:
1.确保您已经正确安装了OpenHardwareMonitor库,并且已经在项目中引用了该库。可以通过在“解决方案资源管理器”中右键单击项目名称,然后选择“管理NuGet程序包”来检查库是否正确安装。
2.检查是否已正确引用所有必需的命名空间。在您提供的代码中,似乎没有使用OpenHardwareMonitor的命名空间,建议添加上去。
3.尝试在代码中添加异常处理程序,以便在发生异常时能够获取更多信息。例如,在GetCPUTemp方法中,可以使用try-catch块捕获异常,然后在控制台或其他日志记录工具中输出异常信息,以便更好地了解发生了什么错误。
4.尝试将OpenHardwareMonitor的权限提升为管理员权限。可以尝试以管理员身份运行Visual Studio,或者在项目中设置管理员权限,以便可以访问必需的系统文件。
5.如果上述方法都无法解决问题,可以尝试重新安装OpenHardwareMonitor库,并尝试使用其他版本。有时候,库的版本不兼容也可能导致类似的问题。
希望这些建议能帮助您解决问题。
不知道你这个问题是否已经解决, 如果还没有解决的话:光有源代码没用,你得找到那个dll库文件。好比你光有菜谱没有买菜,怎么做菜?