一般情况下在开发应用程序的时候都很少考虑一些系统部分的变化对应用程序带来影响比如系统字体库里的字体增加或减少用户注销或系统关机桌面主题变换等等针对应用程序的不同或多或少会造成一些影响比如程序在运行过程中没有退出就被用户注销有可能造成数据丢失系统字体的更改或系统时钟的更改对程序造成界面显示上或处理上的影响如果需要程序有一定的健壮性就需要在这些事件发生时做一些处理幸运的是为实现这些功能我们不需要自己写一些繁杂的代码 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类这也是一个很有用的类它提供了一组静态属性