2008-10-27 3 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, если он включен в Power Power.

+0

Что было бы эквивалентно этому для настольных компьютеров, когда они работают на DC (например, UPS/IPS)? – lbrahim 2015-11-08 10:56:24

0

Вы можете использовать WMI (Инструментарий управления Windows) для запроса операционной системы о состоянии батареи.

Вы можете найти более подробную информацию здесь:

Надежда, что помогает.

4

Вы можете использовать функцию GetSystemPowerStatus, используя P/Invoke. См: 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

Я не верю, что он отображается в управляемом коде, но вы можете использовать Win32 GetSystemPowerStatus через pinvoke для получения этой информации.

В качестве альтернативы вам может потребоваться использовать GetCurrentPowerPolicies или аналогично, чтобы определить предпочтения пользователей, относящиеся к управлению производительностью/питанием.

+0

Быстрый просмотр API (http://msdn.microsoft.com/en-us/library/aa372689(VS.85).aspx) не показал ничего, связанного с любыми предпочтениями пользователя. Он возвращает такие вещи, как медленный процессор, и если монитор будет затемнен, а вентиляторы будут выключены и т. Д. – 2008-10-27 19:53:32

+0

Да - скорость процессора - это предпочтение пользователя, которое можно контролировать с помощью панели управления Power Settings. Просто предложение. – 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); 
    } 
} 
Смежные вопросы