C # - Поднять событие при изменении PowerStatus - PullRequest
9 голосов
/ 21 марта 2011

Я создал приложение, которое должно быть в безопасном состоянии, и поэтому я хочу следить за состоянием питания компьютера в фоновом режиме.Если уровень заряда батареи (если есть) низкий или критический, я бы не позволил пользователю продолжать использовать приложение и корректно завершать работу.

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

Итак, я создал обертку вокруг него, что-то вроде этого:

using System;
using System.Windows.Forms;

namespace MyApp
{
    internal static class BatteryManagement
    {
        //
        internal static event EventHandler<EventArgs> Changed;

        //
        private static bool _started;
        private static System.Threading.Timer _timer;
        private static PowerStatus _previousPowerStatus;

        internal static void Start()
        {
            if (!_started)
            {
                _started = true;
                ManageBatteryLevel();
            }
        }

        internal static void Stop()
        {
            if (_started)
            {
                if(_timer != null)
                {
                    _timer.Dispose();
                    _timer = null;
                }

                _started = false;
            }
        }

        private static void ManageBatteryLevel()
        {
            _previousPowerStatus = new PowerStatus();

            TimeSpan dueTime = new TimeSpan(0, 0, 0); // Start right now
            TimeSpan period = new TimeSpan(0, 1, 0); // Run every 1 minute

            // Setting a timer that launch every period the OnBatteryLevelChange method
            _timer = new System.Threading.Timer(OnBatteryLevelChange, null, dueTime, period);
        }

        private static void OnBatteryLevelChange(Object stateInfo)
        {
            PowerStatus powerStatus = new PowerStatus();

            if (!_previousPowerStatus.Equals(powerStatus))
            {
                // Ensure battery level is up to date before raising event
                _previousPowerStatus = powerStatus;

                if (Changed != null)
                {
                    Changed(null, EventArgs.Empty);
                }
            }
        }
    }
}

Но не работает, потому что PowerStatus не имеет никакихпубличный конструктор, и я не могу сохранить результат предыдущего статуса ...

Как мне управлять этим?

Спасибо ...

Ответы [ 4 ]

12 голосов
/ 21 марта 2011

На самом деле, она называется SystemEvents.PowerModeChanged

Если PowerModeChangedEventArgs имеет Mode из StatusChange, это означает, что состояние батареи изменилось.

static void SystemEvents_PowerModeChanged(object sender, Microsoft.Win32.PowerModeChangedEventArgs e)
{
    if (e.Mode == Microsoft.Win32.PowerModes.StatusChange)
    {
         // Check what the status is and act accordingly
    }
}

Этот учебник также может быть полезен:

http://netcode.ru/dotnet/?lang=&katID=30&skatID=277&artID=7643

7 голосов
/ 21 марта 2011

Вам нужно позвонить SystemInformation.PowerStatus вместо new PowerStatus(), если вы пытаетесь получить текущее состояние питания.

2 голосов
/ 21 марта 2011

Вот код, который вернет вам все значения PowerStatus

Type t = typeof(System.Windows.Forms.PowerStatus);            
PropertyInfo[] pi = t.GetProperties();            
for( int i=0; i<pi.Length; i++ )
{
    Console.WriteLine("Property Name {0}", pi[i].Name);
    Console.WriteLine("Property Value {0}", pi[i].GetValue(SystemInformation.PowerStatus, null));
}

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

1 голос
/ 21 марта 2011

вы правы, информация на MSDN вообще бесполезна, вы найдете здесь то, что вам нужно для вашей задачи:

http://www.blackwasp.co.uk/PowerStatus.aspx

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

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