C # .NET: Как проверить, работаем ли мы от батареи? - PullRequest
27 голосов
/ 27 октября 2008

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

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

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

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

Бонус Чтение

Ответы [ 6 ]

31 голосов
/ 27 октября 2008

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

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

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

8 голосов
/ 27 октября 2008

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);
   }
}
7 голосов
/ 27 октября 2008

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

Ответ Powerlord, похоже, не работает, возможно, потому что он был получен в 2008 году.

Вот версия, которая работала для меня:

Boolean x = (System.Windows.SystemParameters.PowerLineStatus == System.Windows.PowerLineStatus.Offline);
0 голосов
/ 27 октября 2008

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

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

0 голосов
/ 27 октября 2008

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...