C#用opneHardwareMonitor获取显卡温度

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

img

版本2、nuget的 OpenHardwareMonitor.0.9.6

img

这是测试代码,添加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库,并尝试使用其他版本。有时候,库的版本不兼容也可能导致类似的问题。

希望这些建议能帮助您解决问题。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt: 您好,针对您的问题,我可以提供以下解决方案: 1. 确认OpenHardwareMonitor库已正确引用到您的C#程序中。可以通过检查项目引用来确认。如果未正确引用,请下载库并将其打包成.dll文件,然后将其添加到项目引用中。 2. 确认您的操作系统与OpenHardwareMonitor库的版本兼容。建议将库与操作系统位数保持一致。 3. 确认您的程序是否有足够的权限来访问系统文件。建议以管理员身份运行程序或者将程序运行路径调整为非系统目录。 4. 如果上述步骤均无法解决问题,可以尝试使用其他库如NVAPI或GPU-Z来获取显卡温度。 以下是一个使用NVAPI获取显卡温度的示例代码: ``` [DllImport("nvapi.dll")] public static extern IntPtr nvapi_QueryInterface(uint id); [DllImport("nvapi.dll")] public static extern int nvapi_Initialize(); [DllImport("nvapi.dll")] public static extern int nvapi_GPU_GetThermalSettings(IntPtr hPhysicalGpu, int sensorIndex, ref NV_GPU_THERMAL_SETTINGS sensorValues); public struct NV_GPU_THERMAL_SETTINGS { public uint version; public uint count; public uint reserved0; public NV_GPU_THERMAL_INFO thermalInfo; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] public NV_GPU_THERMAL_SENSOR[] sensor; } public struct NV_GPU_THERMAL_INFO { public uint sensor[NVAPI.MAX_THERMAL_SENSORS_PER_GPU]; public uint reserved0; public uint reserved1; public uint reserved2; } public struct NV_GPU_THERMAL_SENSOR { public int currentTemp; public int target; public int control; public int defaultMax; public int defaultMin; public int currentMin; public int currentMax; public uint type; public uint index; public uint flags; public uint reserved; } public class NvApiWrapper { public static float GetGpuTemperature() { nvapi_Initialize(); uint gpuCount = 0; NvAPI.NvAPI_EnumPhysicalGPUs(IntPtr.Zero, ref gpuCount); IntPtr[] gpuHandles = new IntPtr[gpuCount]; NvAPI.NvAPI_EnumPhysicalGPUs(gpuHandles, ref gpuCount); NV_GPU_THERMAL_SETTINGS sensorValues = new NV_GPU_THERMAL_SETTINGS(); sensorValues.version = NV_GPU_THERMAL_SETTINGS_VER; sensorValues.count = NVAPI.MAX_THERMAL_SENSORS_PER_GPU; for (int i = 0; i < gpuCount; i++) { NvAPI.nvapi_GPU_GetThermalSettings(gpuHandles[i], 0, ref sensorValues); } float temperature = sensorValues.sensor[0].currentTemp / 1000f; return temperature; } private const uint NV_GPU_THERMAL_SETTINGS_VER = 0x00010003; } ``` 此代码使用NVAPI库获取显卡温度,并将值除以1000以获取实际温度,可用于在C#中获取显卡温度。

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

光有源代码没用,你得找到那个dll库文件。好比你光有菜谱没有买菜,怎么做菜?