Я создал простую программу для лотка, которая отображает температуру процессора и обновляет каждую секунду с помощью таймера.(C#, WMI) Приложение Tray Отображение температуры процессора только обновляет значение при запуске приложения SpeedFan
Значок в трее отображает параметр «CurrentTemperature», полученный из запроса ManagementObjectSearcher, который затем используется для создания растрового изображения, отображающего значение температуры.
Кажется, что он работает хорошо, за исключением того факта, что он всегда получает точно такое же значение температуры. Однако, если у меня есть SpeedFan, работающий в фоновом режиме, то температура будет обновляться соответственно.
Может ли кто-нибудь дать мне представление о том, почему приложение не может получить обновленное значение температуры самостоятельно?
Примечание: Я проверил BIOS моей машины и нет показаний температуры
Я прилагаю код для тех, кто заинтересован/готов давать советы
class Program
{
private static System.Timers.Timer tmr;
private static ContextMenu CMenu;
private static NotifyIcon trayIcon;
private static Color c;
private static int Temp;
private static int _Temp;
private static void Main(string[] args)
{
tmr = new System.Timers.Timer();
trayIcon = new NotifyIcon();
CMenu = new ContextMenu();
//ContextMenu
CMenu.MenuItems.Add("Exit", Exit_Application);
//trayIcon
trayIcon.ContextMenu = CMenu;
trayIcon.Visible = true;
//Timer
tmr.Interval = 1000;
tmr.Elapsed += new ElapsedEventHandler(onTimerTick);
tmr.Enabled = true;
Temp = 0;
Application.Run();
}
private static void Exit_Application(object Sender, EventArgs e) { trayIcon.Icon = null; Application.Exit(); }
private static void onTimerTick(object Sender, ElapsedEventArgs e)
{
using (ManagementObjectSearcher mos = new ManagementObjectSearcher("root\\WMI", "SELECT * FROM MSAcpi_ThermalZoneTemperature"))
{
using (ManagementObject mo = mos.Get().OfType<ManagementObject>().First())
{
_Temp = int.Parse(mo["CurrentTemperature"].ToString())/10 - 273; //Convert To Celsius
if (_Temp != Temp)
{
Temp = _Temp;
trayIcon.Icon = CreateIcon(Temp);
}
if (Temp >= 85) { Console.Beep(); }
}
}
}
private static Icon CreateIcon(int value)
{
if (value < 50) { c = Color.FromArgb(0, 255, 0); }
else if (value >= 80){ c = Color.OrangeRed; }
else { c = Color.Yellow; }
using (Bitmap bm = new Bitmap(16, 16))
{
using (Graphics g = Graphics.FromImage(bm))
{
using (Brush b = new SolidBrush(c))
{
g.DrawString(value.ToString(), SystemFonts.DefaultFont, b, 0, 0);
return Icon.FromHandle(bm.GetHicon());
}
}
}
}
}