2011-03-21 59 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)); 
} 

所有的值。