Подтвердить что ты не робот

С#.NET: Как проверить, работает ли аккумулятор?

Я хочу быть хорошим гражданином-разработчиком, заплатить мои налоги и отключить вещи, если мы запускаем Remote Desktop или запускаем на батарее.

Если мы работаем на удаленном рабочем столе (или, что то же самое, на сеансе сервера терминалов), мы должны отключить анимацию и двойную буферизацию. Вы можете проверить это с помощью:

/// <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;
  • свести к минимуму доступ к жесткому диску - чтобы избежать разворота.
  • минимизировать доступ к сети - для экономии энергии Wi-Fi.

Есть ли способ убедиться, что машина в настоящее время работает на батарее?

Ссылки

Как вы убеждаете разработчиков платить свои "налоги" ?

Налоги: подключение к удаленному рабочему столу и роспись

GetSystemMetrics (SM_REMOTESESSION)

4b9b3361

Ответ 1

Я считаю, что вы можете проверить SystemInformation.PowerStatus, чтобы узнать, есть ли он на батарее или нет.

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

Изменить: В дополнение к вышесказанному, также существует класс System.Windows.Forms. PowerStatus. Один из его методов - PowerLineStatus, который будет равен PowerLineStatus.Online, если он включен в AC Power.

Ответ 2

R. Бемроуз нашел управляемый звонок. Вот пример кода:

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

Ответ 3

Вы можете использовать функцию 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);
        }
    }
}

Ответ 4

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

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

Надеюсь, что это поможет.

Ответ 5

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

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