Мониторинг системы через WMI, Open Hardware Monitor
Цитата: Виктор от 20.11.2021, 07:19Здравствуйте, есть задачка сделать примитивный монитор характеристик компьютера в реальном времени. Проблема в том, что как мне кажется WMI считывает данные только один раз при запуске ПК и больше их не обновляет. Знаю, что у Open Hardware Monitor есть dll, которую можно подключить к проекту и брать данные из нее. Причем исходный код программы есть на github и он успешно собирается в саму программу, где все работает. В связи с этим возникают вопросы:
- Можно ли считывать характеристики ПК в реальном времени через WMI?
- Откуда Open Hardware Monitor берет данные о ПК, если он можно считать, что весь написан на C#?
Признаюсь честно, второй вопрос меня интересует больше, потому что ManagementObjectSearcher используется в Open Hardware Monitor всего лишь два раза.
[spoiler title="попытки получить данные через 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, что не может быть правдой
[/spoiler]
Здравствуйте, есть задачка сделать примитивный монитор характеристик компьютера в реальном времени. Проблема в том, что как мне кажется WMI считывает данные только один раз при запуске ПК и больше их не обновляет. Знаю, что у Open Hardware Monitor есть dll, которую можно подключить к проекту и брать данные из нее. Причем исходный код программы есть на github и он успешно собирается в саму программу, где все работает. В связи с этим возникают вопросы:
- Можно ли считывать характеристики ПК в реальном времени через WMI?
- Откуда Open Hardware Monitor берет данные о ПК, если он можно считать, что весь написан на C#?
Признаюсь честно, второй вопрос меня интересует больше, потому что ManagementObjectSearcher используется в Open Hardware Monitor всего лишь два раза.
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, что не может быть правдой
Цитата: Mihail от 23.01.2022, 18:56Привет !
Я тоже старался FROM MSAcpi_ThermalZoneTemperature но так и не понял по какому принципу работает.
Нашел информацию на OpenHardwareMonitor и сделал вот что.
[spoiler title="Код"]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(); } } } }[/spoiler]
Если еще что то надо то можешь поискать .
Кстати очень помог урок Видео про foreach !
[MNotice]Убирайте код под спойлер.[/MNotice]
Привет !
Я тоже старался 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 !
Комментарий модератора:
Убирайте код под спойлер.