2016-04-22 3 views
0

Ich habe eine einfache Tray-App erstellt, die die CPU-Temperatur anzeigt und jede Sekunde mit einem Timer aktualisiert.(C#, WMI) Tray-App Anzeige der CPU-Temperatur aktualisiert nur den Wert, wenn die SpeedFan-App läuft

Das Taskleistensymbol zeigt den Parameter "CurrentTemperature" an, der von der ManagementObjectSearcher-Abfrage abgerufen wurde. Dieser Parameter wird dann zum Erstellen einer Bitmap verwendet, die den Temperaturwert anzeigt.

Es scheint gut zu funktionieren, außer dass es immer den exakt gleichen Temperaturwert abfragt. Wenn ich jedoch SpeedFan im Hintergrund ausgeführt habe, wird die Temperatur entsprechend aktualisiert.

Könnte mir jemand einen Einblick geben, warum die App den aktualisierten Temperaturwert nicht selbst abrufen kann?

Hinweis: Ich habe meine Maschine BIOS überprüft und es gibt keine Temperaturwerte

ich den Code für alle Interessierten/bereit Beratung

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()); 
       } 
      } 
     } 
    } 
} 

Antwort

0

geben Anbringen Nach weiteren IT-Forschung erscheint, dass WMI CPU-Temperaturen nicht lesen kann, fand ich die Erklärung Here

Verwandte Themen