Вы должны войти, чтобы создавать сообщения и темы.

Мониторинг системы через WMI, Open Hardware Monitor

Здравствуйте, есть задачка сделать примитивный монитор характеристик компьютера в реальном времени. Проблема в том, что как мне кажется WMI считывает данные только один раз при запуске ПК и больше их не обновляет. Знаю, что у Open Hardware Monitor есть dll, которую можно подключить к проекту и брать данные из нее. Причем исходный код программы есть на github и он успешно собирается в саму программу, где все работает. В связи с этим возникают вопросы:

  1. Можно ли считывать характеристики ПК в реальном времени через WMI?
  2. Откуда Open Hardware Monitor берет данные о ПК, если он можно считать, что весь написан на C#?

Признаюсь честно, второй вопрос меня интересует больше, потому что ManagementObjectSearcher используется в Open Hardware Monitor всего лишь два раза.

попытки получить данные через WMI

using System;
using System.Management;

namespace ConsoleApp4
{
    class Program
    {
        static void Main(string[] args)
        {
            ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Processor");

            foreach (ManagementObject obj in searcher.Get())
            {
                var clockSpeed = obj["CurrentClockSpeed"].ToString();

                Console.WriteLine($"CurrentClockSpeed: {clockSpeed}");
            }


            ManagementObjectSearcher searcher2 = new ManagementObjectSearcher(@"root\WMI", "SELECT * FROM MSAcpi_ThermalZoneTemperature");
            foreach (ManagementObject obj in searcher2.Get())
            {
                Double temperature = Convert.ToDouble(obj["CurrentTemperature"].ToString());
                temperature = (temperature - 2732) / 10.0;
                Console.WriteLine($"CurrentTemperature: {temperature}");
            }
        }
    }
}

Выдает: 4001 и 27.8, 29.8, что не может быть правдой

Думаю тебе поможет это.

Привет !
Я тоже старался  FROM MSAcpi_ThermalZoneTemperature но так и не понял по какому принципу работает.
Нашел информацию на  OpenHardwareMonitor и  сделал вот что.

Код

using System;
using OpenHardwareMonitor.Hardware;

namespace temp
{
    class Program
    {
        static float cpuTemp;

        static Computer computer = new Computer()
        {
            CPUEnabled = true,
        };

        static void ReportCpuTemp()
        {
            foreach (var hardware in computer.Hardware)
            {
                if (hardware.HardwareType == HardwareType.CPU)
                {
                    // запускать обновление только при обнаружении
                    hardware.Update();

                    // постоянный опрос 
                    foreach (var sensor in hardware.Sensors)
                        if (sensor.SensorType == SensorType.Temperature && sensor.Name.Contains("CPU Package"))
                        {
                            
                            cpuTemp = sensor.Value.GetValueOrDefault();
                            // вывод в консоль
                            Console.WriteLine("cpuTemp: " + sensor.Value.GetValueOrDefault());

                        }
                        
                }


            }
        }

        private static void Main(string[] args)
        {
            computer.Open();

            // бесконечный цикл
            while (true)
            {
                ReportCpuTemp();
            }
        }
    }
}

Если еще что то надо то можешь поискать .
Кстати очень помог урок Видео про foreach !


Комментарий модератора:
Убирайте код под спойлер.