2008-10-27 97 views
25

我想成爲一名優秀的開發人員公民,pay my taxes,如果我們在遠程桌面上運行或使用電池運行,則禁用這些功能。C#.NET:如何檢查我們是否使用電池?

如果我們正在運行遠程桌面(或等同於終端服務器會話),我們必須禁用動畫和雙緩衝。你可以檢查:

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

現在我需要找出用戶是否在使用電池供電。如果他們是,我不想吹他們的電池。我想要做的事情,如

  • 禁用動畫
  • 禁用後臺拼寫檢查
  • 啓動後臺打印
  • 關閉梯度
  • 使用graphics.SmoothingMode = SmoothingMode.HighSpeed;
  • 使用graphics.InterpolationMode = InterpolationMode.Low;
  • 使用graphics.CompositingQuality = CompositingQuality.HighSpeed;
  • mi nimize硬盤接入 - 避免旋轉了起來
  • 最小化網絡訪問 - 以節省電力的WiFi

有沒有一種管理方法,如果機器是目前電池運行?

參考

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

Taxes: Remote Desktop Connection and painting

GetSystemMetrics(SM_REMOTESESSION)

回答

27

我相信你可以檢查SystemInformation.PowerStatus,看它是否對電池或沒有。

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

編輯:除上述之外,還有一個System.Windows.Forms。 PowerStatus班。其中一種方法是PowerLineStatus,如果它使用交流電,它將等於PowerLineStatus.Online。

+0

臺式電腦在DC(例如UPS/IPS)上運行時,這與其相當甚麼? – lbrahim 2015-11-08 10:56:24

4

您可以使用使用P/Invoke的GetSystemPowerStatus函數。請參閱: http://msdn.microsoft.com/en-gb/library/aa372693.aspx

下面是一個例子:

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

只是爲了獲取信息,我有一個Windows平板電腦,不使用win32_Battery或PowerStatus返回信息。但是這工作。 +1。謝謝。 – user1531978 2016-02-20 22:33:24

-1

我不相信它在託管代碼中公開,但您可以通過pinvoke使用Win32 GetSystemPowerStatus來獲取此信息。另外,您可能需要考慮使用GetCurrentPowerPolicies或類似方法來確定與性能/電源管理相關的用戶首選項。

+0

快速瀏覽API(http://msdn.microsoft.com/en-us/library/aa372689(VS.85).aspx)並未顯示與任何用戶首選項相關的任何內容。它會返回CPU的運行速度,以及顯示器將變暗並且風扇將關閉等情況。 – 2008-10-27 19:53:32

+0

是 - CPU速度是可以通過「電源設置」控制面板控制的用戶首選項。 只是一個建議。 – 2008-10-27 21:27:58

7

R. Bemrose找到了託管電話。這裏有一些示例代碼:

/// <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); 
    } 
} 
相關問題