2008-10-27 6 views
25

Chcę być dobrym obywatelem programisty, pay my taxes, i wyłączać rzeczy, jeśli korzystamy z Pulpitu zdalnego lub z baterii.C# .NET: Jak sprawdzić, czy używamy baterii?

Jeśli pracujemy na pulpicie zdalnym (lub równoważnie w sesji serwera terminali), musimy wyłączyć animacje i podwójne buforowanie. Możesz to sprawdzić pod adresem:

/// <summary> 
/// Indicates if we're running in a remote desktop session. 
/// If we are, then you MUST disable animations and double buffering i.e. Pay your taxes! 
/// 
/// </summary> 
/// <returns></returns> 
public static Boolean IsRemoteSession 
{ 
    //This is just a friendly wrapper around the built-in way 
    get 
    { 
     return System.Windows.Forms.SystemInformation.TerminalServerSession; 
    } 
} 

Teraz muszę sprawdzić, czy użytkownik jest zasilany z baterii. Jeśli tak, nie chcę przedmuchać ich baterii. Chcę robić rzeczy takie jak

  • niepełnosprawnymi animacji
  • wyłączyć tło sprawdzania pisowni
  • wyłączyć drukowanie w tle
  • Wyłącz gradienty
  • użytku graphics.SmoothingMode = SmoothingMode.HighSpeed;
  • użycie graphics.InterpolationMode = InterpolationMode.Low;
  • użycie graphics.CompositingQuality = CompositingQuality.HighSpeed;
  • mi nimalizuj twardego dysku dostępu - aby uniknąć rozpędzają
  • zminimalizować dostęp do sieci - w celu oszczędzania energii WiFi

Czy istnieje sposób udało by sprawdzić, czy maszyna jest obecnie działa na baterii?

Referencje

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

Taxes: Remote Desktop Connection and painting

GetSystemMetrics(SM_REMOTESESSION)

Odpowiedz

27

wierzę można sprawdzić SystemInformation.PowerStatus, aby zobaczyć, czy to na baterii, czy nie.

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

Edytuj: Oprócz powyższych istnieje również System.Windows.Forms. PowerStatus klasa. Jedną z jej metod jest PowerLineStatus, która będzie równała się PowerLineStatus.Online, jeśli jest na zasilaniu AC.

+0

Jaki byłby odpowiednik tego w przypadku komputerów stacjonarnych, gdy są one zasilane prądem stałym (np. UPS/IPS)? – lbrahim

4

Można użyć funkcji GetSystemPowerStatus za pomocą P/Invoke. Zobacz: http://msdn.microsoft.com/en-gb/library/aa372693.aspx

Oto przykład:

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

Tylko dla celów informacyjnych, mam tablet z systemem Windows, który nie zwraca informacji za pomocą Win32_Battery lub PowerStatus. Ale to zadziałało. +1. Dzięki. – user1531978

-1

Nie wierzę, że jest ujawniony w zarządzanym kodzie, ale można użyć Win32 GetSystemPowerStatus przez pinvoke, aby uzyskać te informacje.

Na marginesie warto rozważyć użycie GetCurrentPowerPolicies lub podobnych w celu określenia preferencji użytkowników dotyczących wydajności/zarządzania energią.

+0

Szybkie spojrzenie na API (http://msdn.microsoft.com/en-us/library/aa372689(VS.85).aspx) nie wykazało niczego związanego z preferencjami użytkownika. Zwraca to, jak powolny jest procesor, a jeśli monitor zostanie przyciemniony, a wentylatory zostaną wyłączone itp. –

+0

Tak - szybkość procesora jest preferencją użytkownika, którą można kontrolować za pomocą panelu sterowania Ustawienia zasilania. Tylko sugestia. –

+0

Spodziewałem się takich rzeczy jak "Wyłącz animacje", "Wyłącz efekty przezroczystości szkła", "Wyłącz dźwięki ostrzegawcze", itp. –

7

R. Bemrose znalazł zarządzane połączenie. Oto przykładowy kod:

/// <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

prosze po prostu odesłać pls == PowerLineStatus.Offline; To rani moje oczy. –

+0

Preferuję funkcję pomocnika, aby ludzie nie musieli ponownie się uczyć, jak sprawdzić stan linii zasilania. I nikt nie mówi, że istnieje tylko jedna wartość wyliczeniowa "na baterii". Zwłaszcza, że ​​w wyliczeniu jest 3. wartość. Chcę jednej implementacji dla "jesteśmy na baterii" i centralnej implementacji, którą można naprawić, gdy okaże się ona niewłaściwa. –

+5

Nie mówi on, że funkcja pomocnika jest w porządku, ale twój kod ma anty-wzorzec if (blah) {return true; } else {return false; } gdy zamiast tego powinien po prostu być return (bla); –