我创建了一个需要处于安全状态的应用程序,所以我想在后台跟踪计算机的电源状态。如果电池电量(如果有)低或严重,我将不允许用户继续使用该应用程序并正确退出。
首先,我很惊讶没有这样的事件来检测变化。您需要始终手动检查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没有任何公共构造函数,我无法存储以前状态的结果......
我该如何管理?
谢谢...
答案 0 :(得分:12)
实际上有,它被称为SystemEvents.PowerModeChanged
如果PowerModeChangedEventArgs
的{{1}}为Mode
,则表示电池状态已更改。
StatusChange
本教程也可能有用:
http://netcode.ru/dotnet/?lang=&katID=30&skatID=277&artID=7643
答案 1 :(得分:7)
如果您尝试获取当前的电源状态,则需要致电SystemInformation.PowerStatus
而不是new PowerStatus()
。
答案 2 :(得分:2)
以下是一些代码,它们将返回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));
}
希望这有帮助。
答案 3 :(得分:1)