熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

使用.net下的系統事件增強應用程序

2022-06-13   來源: Java核心技術 

  一般情況下在開發應用程序的時候都很少考慮一些系統部分的變化對應用程序帶來影響比如系統字體庫裡的字體增加或減少用戶注銷或系統關機桌面主題變換等等針對應用程序的不同或多或少會造成一些影響比如程序在運行過程中沒有退出就被用戶注銷有可能造成數據丟失系統字體的更改或系統時鐘的更改對程序造成界面顯示上或處理上的影響如果需要程序有一定的健壯性就需要在這些事件發生時做一些處理幸運的是為實現這些功能我們不需要自己寫一些繁雜的代碼 FCL提供了一個類MicrosoftWinSystemEvents來很好的完成這項任務在看大師Charles Petzold著的《Microsoft C# Windows 程序設計》的時候發現這個類想必許多人都已經用過了不過還是決定自己寫一些代碼來體驗一下
  
  打開NET Framework SDK 文檔查看SystemEvents的信息它作為一個類提供了一些靜態事件我新建一個Windows 項目對一些事件進行了測試
  
  在窗體構造函數中注冊一堆靜態事件
  
  public Form()
  
  {
  
  InitializeComponent();
  
  //當用戶更改顯示設置時發生
  
  SystemEventsDisplaySettingsChanged += new EventHandler(SystemEvents_DisplaySettingsChanged);
  
  //在偵聽系統事件的線程終止前發生將在事件線程上調用委托
  
  SystemEventsEventsThreadShutdown += new EventHandler(SystemEvents_EventsThreadShutdown);
  
  //當用戶在系統中添加或移除字體時發生
  
  SystemEventsInstalledFontsChanged += new EventHandler(SystemEvents_InstalledFontsChanged);
  
  //當系統用完可用 RAM 時發生
  
  SystemEventsLowMemory += new EventHandler(SystemEvents_LowMemory);
  
  //當用戶切換到使用其他調色板的應用程序時發生
  
  SystemEventsPaletteChanged += new EventHandler(SystemEvents_PaletteChanged);
  
  //當用戶掛起或繼續系統時發生
  
  SystemEventsPowerModeChanged += new PowerModeChangedEventHandler(SystemEvents_PowerModeChanged);
  
  //當用戶注銷或關閉系統時發生
  
  SystemEventsSessionEnded += new SessionEndedEventHandler(SystemEvents_SessionEnded);
  
  //當用戶試圖注銷或關閉系統時發生
  
  SystemEventsSessionEnding += new SessionEndingEventHandler(SystemEvents_SessionEnding);
  
  //當用戶更改系統時鐘上的時間時發生
  
  SystemEventsTimeChanged += new EventHandler(SystemEvents_TimeChanged);
  
  //在窗口計時器間隔過期時發生
  
  SystemEventsTimerElapsed += new TimerElapsedEventHandler(SystemEvents_TimerElapsed);
  
  //在用戶首選項更改後發生
  
  SystemEventsUserPreferenceChanged += new UserPreferenceChangedEventHandler(SystemEvents_UserPreferenceChanged);
  
  //當用戶首選項更改時發生
  
  SystemEventsUserPreferenceChanging += new UserPreferenceChangingEventHandler(SystemEvents_UserPreferenceChanging);
  
  }
  
  上面的代碼很清楚也很簡單對其中幾個事件處理程序的測試如下
  
  private void SystemEvents_UserPreferenceChanging(object sender UserPreferenceChangingEventArgs e)
  
  {
  
  UserPreferenceCategory category = eCategory;
  
  MessageBoxShow(categoryToString());
  
  }
  
  UserPreferenceCategory是一個枚舉類型每一項值表示標識已更改的用戶首選項區域類型比較多具體可以看MSDN文檔UserPreferenceChanged事件類似使用UserPreferenceChangedEventArgs參數
  
  下面是系統注銷或關閉事件處理程序
  
  private void SystemEvents_SessionEnding(object sender SessionEndingEventArgs e)
  
  {
  
  if(MessageBoxShow(this是否允許系統注銷!系統提示MessageBoxButtonsYesNo) != DialogResultYes)
  
  {
  
  eCancel = true;
  
  }
  
  else
  
  {
  
  eCancel = false;
  
  }
  
  SessionEndReasons reason = eReason;
  
  switch(reason)
  
  {
  
  case SessionEndReasonsLogoff:
  
  MessageBoxShow(用戶正在注銷操作系統繼續運行但啟動此應用程序的用戶正在注銷);
  
  break;
  
  case SessionEndReasonsSystemShutdown:
  
  MessageBoxShow(操作系統正在關閉);
  
  break;
  
  }
  
  }
  
  如果把上面的事件處理程序修改成如下
  
  private void SystemEvents_SessionEnding(object sender SessionEndingEventArgs e)
  
  {
  
  eCancel = true;
  
  }
  
  那會出現什麼情況你點擊開始菜單關機選擇注銷關機或重新啟動將會失效電腦不能正常關機了進一步的話把程序做成Windows服務人不知鬼不覺惡作劇?
  
  SessionEnded事件同上事件參數類為SessionEndedEventArgs同SessionEndingEventArgs相比少了Cancel屬性Cancel屬性同一些windows下的某些事件差不多比如FormClosing事件ControlValidating事件
  
  補充如果需要獲取應用程序需要的系統信息可以訪問SystemWindowsFormsSystemInformation類這也是一個很有用的類它提供了一組靜態屬性
From:http://tw.wingwit.com/Article/program/Java/hx/201311/27060.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.