2011-03-21 90 views
9

我创建了一个需要处于安全状态的应用程序,因此我想在后台跟踪计算机的电源状态。如果电池电量(如果有的话)很低或很重要,我不会允许用户继续使用该应用程序并正确退出。C# - PowerStatus变化引发事件

首先,我惊讶的发现没有这样的事件来检测变化。您需要始终手动检查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); 
       } 
      } 
     } 
    } 
} 

但不起作用,因为电源状态,还没有任何公开的构造,我不能存储先前的结果状态...

我该如何管理?

谢谢...

回答

12

其实有其称为SystemEvents.PowerModeChanged

如果PowerModeChangedEventArgsStatusChange一个Mode,这意味着电池的状态已经改变。

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

+0

这就是我寻找的原因!谢谢:) – 2011-03-21 14:04:42

+0

@Arnaud:没问题;) – w69rdy 2011-03-21 14:09:41

7

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

+1

哪一个可以给你一个参考,对于下一个刻度的存储和比较不是很有用。 – 2011-03-21 14:00:12

+0

@亨克:这就是我回答问题的技术部分而不是如何解决实际问题;)虽然看起来@ w69rdy提供了最佳答案,但OP将不得不缓存由' PowerStatus'类而不是实例本身。我曾假设(错误地)“PowerStatus”是一个简单的结构,而不是实际的类。 – 2011-03-21 14:26:33

2

下面是一些代码,将返回的电源状态,

希望这有助于的
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)); 
} 

所有的值。