使用.net下的系統事件增強應用程式
來源:互聯網
上載者:User
程式 一般情況下,在開發應用程式的時候都很少考慮一些系統部分的變化對應用程式帶來影響,比如系統字型庫裡的字型增加或減少,使用者登出或系統關機,桌面主題變換等等。針對應用程式的不同,或多或少會造成一些影響,比如程式在運行過程中沒有退出就被使用者登出,有可能造成資料丟失,系統字型的更改或系統時鐘的更改對程式造成介面顯示上或處理上的影響。如果需要程式有一定的健壯性,就需要在這些事件發生時做一些處理。幸運的是為實現這些功能我們不需要自己寫一些繁雜的代碼,.net FCL提供了一個類Microsoft.Win32.SystemEvents來很好的完成這項任務,在看大師Charles Petzold著的《Microsoft C# Windows 程式設計》的時候發現這個類,想必許多人都已經用過了,不過還是決定自己寫一些代碼來體驗一下。
開啟.NET Framework SDK 文檔,查看SystemEvents的資訊,它作為一個類提供了一些靜態事件,我建立一個Windows 項目對一些事件進行了測試。
在表單建構函式中註冊一堆靜態事件,
public Form1()
{
InitializeComponent();
//當使用者更改顯示設定時發生。
SystemEvents.DisplaySettingsChanged += new EventHandler(SystemEvents_DisplaySettingsChanged);
//在偵聽系統事件的線程終止前發生。將在事件線程上調用委託。
SystemEvents.EventsThreadShutdown += new EventHandler(SystemEvents_EventsThreadShutdown);
//當使用者在系統中添加或移除字型時發生。
SystemEvents.InstalledFontsChanged += new EventHandler(SystemEvents_InstalledFontsChanged);
//當系統用完可用 RAM 時發生。
SystemEvents.LowMemory += new EventHandler(SystemEvents_LowMemory);
//當使用者切換到使用其他調色盤的應用程式時發生。
SystemEvents.PaletteChanged += new EventHandler(SystemEvents_PaletteChanged);
//當使用者掛起或繼續系統時發生。
SystemEvents.PowerModeChanged += new PowerModeChangedEventHandler(SystemEvents_PowerModeChanged);
//當使用者登出或關閉系統時發生。
SystemEvents.SessionEnded += new SessionEndedEventHandler(SystemEvents_SessionEnded);
//當使用者試圖登出或關閉系統時發生。
SystemEvents.SessionEnding += new SessionEndingEventHandler(SystemEvents_SessionEnding);
//當使用者更改系統時鐘上的時間時發生。
SystemEvents.TimeChanged += new EventHandler(SystemEvents_TimeChanged);
//在視窗計時器間隔到期時發生。
SystemEvents.TimerElapsed += new TimerElapsedEventHandler(SystemEvents_TimerElapsed);
//在使用者喜好設定更改後發生。
SystemEvents.UserPreferenceChanged += new UserPreferenceChangedEventHandler(SystemEvents_UserPreferenceChanged);
//當使用者喜好設定更改時發生。
SystemEvents.UserPreferenceChanging += new UserPreferenceChangingEventHandler(SystemEvents_UserPreferenceChanging);
}
上面的代碼很清楚也很簡單,對其中幾個事件處理常式的測試如下,
private void SystemEvents_UserPreferenceChanging(object sender, UserPreferenceChangingEventArgs e)
{
UserPreferenceCategory category = e.Category;
MessageBox.Show(category.ToString());
}
UserPreferenceCategory是一個枚舉類型,每一項值表示標識已更改的使用者喜好設定地區,類型比較多,具體可以看MSDN文檔,UserPreferenceChanged事件類別似,使用UserPreferenceChangedEventArgs參數。
下面是系統登出或關閉事件處理常式,
private void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e)
{
if(MessageBox.Show(this,"是否允許系統登出!","系統提示",MessageBoxButtons.YesNo) != DialogResult.Yes)
{
e.Cancel = true;
}
else
{
e.Cancel = false;
}
SessionEndReasons reason = e.Reason;
switch(reason)
{
case SessionEndReasons.Logoff:
MessageBox.Show("使用者正在登出。作業系統繼續運行,但啟動此應用程式的使用者正在登出。");
break;
case SessionEndReasons.SystemShutdown:
MessageBox.Show("作業系統正在關閉。");
break;
}
}
如果把上面的事件處理常式修改成如下
private void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e)
{
e.Cancel = true;
}
那會出現什麼情況,你點擊開始菜單關機選擇登出、關機、或重新啟動將會失效,電腦不能順利關機了,進一步的話把程式做成Windows服務,人不知鬼不覺,暈,惡作劇?
SessionEnded事件同上,事件參數類為SessionEndedEventArgs,同SessionEndingEventArgs相比少了Cancel屬性,Cancel屬性同一些windows下的某些事件差不多,比如Form.Closing事件,Control.Validating事件。
補充,如果需要擷取應用程式需要的系統資訊,可以訪問System.Windows.Forms.SystemInformation類,這也是一個很有用的類,它提供了一組靜態屬性。