C# - 关于PowerStatus更改的提升事件

Arn*_* F. 9 c# event-handling

我创建了一个需要处于安全状态的应用程序,所以我想在后台跟踪计算机的电源状态.如果电池电量(如果有)低或严重,我将不允许用户继续使用该应用程序并正确退出.

首先,我很惊讶没有这样的事件来检测变化.您需要始终手动检查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);
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是没有用,因为PowerStatus没有任何公共构造函数,我无法存储以前状态的结果......

我该怎么办呢?

谢谢 ...

Iai*_*ard 12

实际上有,它被称为SystemEvents.PowerModeChanged

如果PowerModeChangedEventArgs有一个ModeStatusChange,这意味着电池的状态已经改变.

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
    }
}
Run Code Online (Sandbox Code Playgroud)

本教程也可能有用:

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


Ada*_*son 7

如果您正在尝试获取当前的电源状态SystemInformation.PowerStatus,new PowerStatus()则需要拨打电话.