2016-04-22 3 views
0

Я создал простую программу для лотка, которая отображает температуру процессора и обновляет каждую секунду с помощью таймера.(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()); 
       } 
      } 
     } 
    } 
} 

ответ

0

После дальнейших исследований что WMI не может читать температуры процессора, я нашел объяснение Here