一般情況下,在開發應用程序的時候都很少考慮一些系統部分的變化對應用程序帶來影響,比如系統字體庫裡的字體增加或減少,用戶註銷或系統關機,桌面主題變換等等。針對應用程序的不同,或多或少會造成一些影響,比如程序在運行過程中沒有退出就被用戶註銷,有可能造成數據丟失,系統字體的更改或系統時鐘的更改對程序造成界面顯示上或處理上的影響。如果需要程序有一定的健壯性,就需要在這些事件發生時做一些處理。幸運的是為實現這些功能我們不需要自己寫一些繁雜的代碼,.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類,這也是一個很有用的類,它提供了一組靜態屬性。
|
|