2008-10-27 2 views
25

Ich möchte ein guter Entwickler Citizen sein, pay my taxes, und Dinge deaktivieren, wenn wir über Remote Desktop laufen oder im Akkubetrieb.C# .NET: Wie kann ich überprüfen, ob wir mit Batterie arbeiten?

Wenn wir über Remote-Desktop (oder äquivalent in einer Terminal-Server-Sitzung) ausgeführt werden, müssen wir Animationen deaktivieren und doppelte Pufferung. Sie können dies überprüfen mit:

Jetzt muss ich herausfinden, ob der Benutzer im Akkubetrieb läuft. Wenn das so ist, möchte ich ihre Batterie nicht durchblasen. Ich möchte Dinge tun, wie

  • deaktivieren Animationen
  • deaktivieren Hintergrund Rechtschreibprüfung
  • Hintergrunddruck deaktivieren
  • Abschaltzeit Steigungen
  • Verwendung graphics.SmoothingMode = SmoothingMode.HighSpeed;
  • Verwendung graphics.InterpolationMode = InterpolationMode.Low;
  • Verwendung graphics.CompositingQuality = CompositingQuality.HighSpeed;
  • mi nimieren Zugang Festplatte - Spin zu vermeiden, bis
  • minimieren Netzzugang - WiFi Leistung

Gibt es einen verwaltetes Weg, um zu sehen, ob die Maschine derzeit läuft auf Batteriestrom zu sparen?

Referenzen

How do you convince developers to pay their "taxes"?

Taxes: Remote Desktop Connection and painting

GetSystemMetrics(SM_REMOTESESSION)

Antwort

27

Ich glaube, Sie SystemInformation.PowerStatus zu überprüfen, um zu sehen, ob es auf Batterie oder nicht.

Boolean isRunningOnBattery = 
     (System.Windows.Forms.SystemInformation.PowerStatus.PowerLineStatus == 
     PowerLineStatus.Offline); 

Bearbeiten: Zusätzlich zu den oben genannten gibt es auch ein System.Windows.Forms. PowerStatus Klasse. Eine seiner Methoden ist PowerLineStatus, die PowerLineStatus.Online gleich ist, wenn es auf Wechselstrom ist.

+0

Was wäre das Äquivalent für Desktop-Computer, wenn sie auf DC (z. B. UPS/IPS) ausgeführt werden? – lbrahim

4

Sie können die GetSystemPowerStatus-Funktion mit P/Invoke verwenden. Siehe: http://msdn.microsoft.com/en-gb/library/aa372693.aspx

Hier ist ein Beispiel:

using System; 
using System.Runtime.InteropServices; 
namespace PowerStateExample 
{ 
    [StructLayout(LayoutKind.Sequential)] 
    public class PowerState 
    { 
     public ACLineStatus ACLineStatus; 
     public BatteryFlag BatteryFlag; 
     public Byte BatteryLifePercent; 
     public Byte Reserved1; 
     public Int32 BatteryLifeTime; 
     public Int32 BatteryFullLifeTime; 

     // direct instantation not intended, use GetPowerState. 
     private PowerState() {} 

     public static PowerState GetPowerState() 
     { 
      PowerState state = new PowerState(); 
      if (GetSystemPowerStatusRef(state)) 
       return state; 

      throw new ApplicationException("Unable to get power state"); 
     } 

     [DllImport("Kernel32", EntryPoint = "GetSystemPowerStatus")] 
     private static extern bool GetSystemPowerStatusRef(PowerState sps); 
    } 

    // Note: Underlying type of byte to match Win32 header 
    public enum ACLineStatus : byte 
    { 
     Offline = 0, Online = 1, Unknown = 255 
    } 

    public enum BatteryFlag : byte 
    { 
     High = 1, Low = 2, Critical = 4, Charging = 8, 
     NoSystemBattery = 128, Unknown = 255 
    } 

    // Program class with main entry point to display an example. 
    class Program 
    {   
     static void Main(string[] args) 
     { 
      PowerState state = PowerState.GetPowerState(); 
      Console.WriteLine("AC Line: {0}", state.ACLineStatus); 
      Console.WriteLine("Battery: {0}", state.BatteryFlag); 
      Console.WriteLine("Battery life %: {0}", state.BatteryLifePercent); 
     } 
    } 
} 
+0

nur zum Zwecke der Information, habe ich ein Fenster Tablette, die nicht zurückkehren Sie Informationen mit win32_Battery oder power. Aber das hat funktioniert. +1. Vielen Dank. – user1531978

-1

Ich glaube nicht, dass es in verwaltetem Code zur Verfügung gestellt wird, aber Sie können den Win32 GetSystemPowerStatus über pinvoke verwenden, um diese Informationen zu erhalten.

Nebenbei möchten Sie vielleicht die Verwendung von GetCurrentPowerPolicies oder Ähnlichem in Betracht ziehen, um die Benutzerpräferenzen in Bezug auf Leistung/Energieverwaltung zu bestimmen.

+0

Ein kurzer Blick auf die API (http://msdn.microsoft.com/en-us/library/aa372689(VS.85).aspx) zeigte nichts in Bezug auf Benutzereinstellungen. Es gibt Dinge wie, wie langsam die CPU geht, und ob der Monitor gedimmt wird und die Lüfter ausgeschaltet werden, usw. –

+0

Ja - die CPU-Geschwindigkeit ist eine Benutzereinstellung, die über das Power Settings Bedienfeld gesteuert werden kann. Nur ein Vorschlag. –

+0

Ich erwartete Dinge wie "Animationen deaktivieren", "Glass Transparenz Effekte deaktivieren", "Alarm Töne deaktivieren", etc. –

7

R. Bemrose hat den verwalteten Anruf gefunden. Hier ist ein Beispielcode:

/// <summary> 
/// Indicates if we're running on battery power. 
/// If we are, then disable CPU wasting things like animations, background operations, network, I/O, etc 
/// </summary> 
public static Boolean IsRunningOnBattery 
{ 
    get 
    { 
     PowerLineStatus pls = System.Windows.Forms.SystemInformation.PowerStatus.PowerLineStatus; 

     //Offline means running on battery 
     return (pls == PowerLineStatus.Offline); 
    } 
} 
+5

Bitte einfach zurückgeben pls == PowerLineStatus.Offline; Das schmerzt meine Augen. –

+0

Ich bevorzuge eine Hilfsfunktion, so dass die Leute nicht immer wieder lernen müssen, wie man den Status der Stromversorgungsleitung überprüft. Und niemand sagt, dass es nur einen Aufzählungswert für "Batterie" gibt. Zumal es einen 3. Wert in der Aufzählung gibt. Ich möchte eine einzige Implementierung für "sind wir auf Batterie" und eine zentrale Implementierung, die behoben werden kann, wenn es sich als falsch herausstellt. –

+5

Nein, er sagt, dass die Hilfsfunktion in Ordnung ist, aber Ihr Code hat das Anti-Pattern von if (blah) {return true; } else {return false; } wenn es stattdessen einfach zurückkehren soll (blah); –

Verwandte Themen