一般情況下
在開發應用程序的時候都很少考慮一些系統部分的變化對應用程序帶來影響
比如系統字體庫裡的字體增加或減少
用戶注銷或系統關機
桌面主題變換等等
針對應用程序的不同
或多或少會造成一些影響
比如程序在運行過程中沒有退出就被用戶注銷
有可能造成數據丟失
系統字體的更改或系統時鐘的更改對程序造成界面顯示上或處理上的影響
如果需要程序有一定的健壯性
就需要在這些事件發生時做一些處理
幸運的是為實現這些功能我們不需要自己寫一些繁雜的代碼 FCL提供了一個類Microsoft
Win
SystemEvents來很好的完成這項任務
在看大師Charles Petzold著的《Microsoft C# Windows 程序設計》的時候發現這個類
想必許多人都已經用過了
不過還是決定自己寫一些代碼來體驗一下
打開
NET Framework SDK 文檔
查看SystemEvents的信息
它作為一個類提供了一些靜態事件
我新建一個Windows 項目對一些事件進行了測試
在窗體構造函數中注冊一堆靜態事件
public Form
()
{
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類
這也是一個很有用的類
它提供了一組靜態屬性
From:http://tw.wingwit.com/Article/program/Java/hx/201311/27060.html