【问题标题】:C# - Raise event on PowerStatus changeC# - 在 PowerStatus 更改时引发事件
【发布时间】:2011-03-21 13:45:28
【问题描述】:

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

首先,我很惊讶不存在这样的事件来检测变化。您需要始终手动检查 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 没有任何公共构造函数,我无法存储先前状态的结果...

我该如何管理?

谢谢...

【问题讨论】:

    标签: c# event-handling


    【解决方案1】:

    其实有,叫SystemEvents.PowerModeChanged

    如果PowerModeChangedEventArgsModeStatusChange,则表示电池状态发生了变化。

    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

    【讨论】:

    • 这就是我要找的原因!谢谢:)
    【解决方案2】:

    如果您想获取当前的电源状态,您需要调用SystemInformation.PowerStatus 而不是new PowerStatus()

    【讨论】:

    • 哪个给你一个参考,对于存储和在下一个刻度比较不是很有用。
    • @Henk:这就是我回答问题的技术部分而不是如何解决实际问题的结果;)虽然看起来@w69rdy 提供了最佳答案,但 OP 必须缓存PowerStatus 类而不是实例本身返回的值。我曾假设(错误地)PowerStatus 是一个简单的结构而不是一个实际的类。
    【解决方案3】:

    这里有一些代码会返回 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));
    }
    

    希望这会有所帮助。

    【讨论】:

      【解决方案4】:

      你说得对,MSDN 上的信息一点用处都没有,你会在这里找到你需要的东西:

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

      希望对你有帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-16
        • 2016-02-23
        • 1970-01-01
        相关资源
        最近更新 更多