使用.net下的系统事件增强应用程序

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


转:使用.net下的系统事件增强应用程序

转:http://developer.51cto.com/art/200509/3401.htm一般情况下,在开发应用程序的时候都很少考虑一些系统部分的变化对应用程序带来影响,比如系统字体库里的字体增...
  • flyskylf
  • flyskylf
  • 2008年01月04日 11:28
  • 404

C#控制台程序中处理2个关闭事件的代码实例

From: http://www.cnblogs.com/lvxiangjack/p/5363627.html 我们开发的控制台应用,在运行阶段很有可能被用户Ctrl+C终止或是被用...
  • JoeBlackzqq
  • JoeBlackzqq
  • 2017年07月07日 09:53
  • 629

创建.NET应用程序所经历的步骤

1、使用某种.NET兼容语言(如C#)编写应用程序。 2、把代码编译为(CIL),存储在程序集中。 3、在执行代码时(如果这是一个可执行文件,就自动运行,或者在其他代码使用它时运行),首先必须使用...
  • ahao214
  • ahao214
  • 2015年03月06日 22:54
  • 837

程序打包,"错误:应用程序无法启动,因为应用程序的并行配置不正确。有关详细信息,请参阅应用程序事件日志,或使用命令行sxstrace.exe"工具解决办法

最近项目功能做完,基本测试也过了一下,程序打包,在自己的的电脑上面运行正常,但是当把程序拷贝到其他没有安装开发环境的电脑上面,程序报如下错误:  一 在网上搜索资料,http://jingy...
  • u011018278
  • u011018278
  • 2016年07月11日 10:26
  • 3638

C# WinForm应用程序降低系统内存占用方法总结

这篇文章主要介绍了C# WinForm应用程序降低系统内存占用方法总结,本文总结了9个方法,同时给出了一个定期清理执行垃圾回收代码,需要的朋友可以参考下 背景: 微软的 .NET FR...
  • powerat123
  • powerat123
  • 2015年05月30日 15:19
  • 541

使用C#开发数据库应用系统_初识Windows程序

第1章 初识Windows程序 一.第一个Windows程序 1.创建Windows程序 不需要一行代码,就能够运行出一个窗体,这得益于Visual Studio和.NET Framework的...
  • hacker_A
  • hacker_A
  • 2017年11月06日 22:24
  • 332

例说.NET事件的使用

一 概要 本文通过实例介绍了.NET事件的使用方法。 二 实例演示 1 新建Windows应用程序EventExp,程序结构如下图所示。   图1 程序结构图 2 新建教师类Tea...
  • tiana0
  • tiana0
  • 2014年08月31日 17:29
  • 1454

北斗地基增强系统

不知道大家对这些了解不了解,新接触的东西,对我产生了很大的兴趣,我的思想活跃了。...
  • qq1170991326
  • qq1170991326
  • 2015年05月04日 21:34
  • 1812

使用.net开发Windows应用程序的过程概要

在.net环境下开发Windows应用程序,相比于visual studio 6.0确实简单了不少。至少,使用起来的感觉比较直观,也只需要不多的代码就可以搭建起一个应用程序的框架。笔者在Visual ...
  • z365days
  • z365days
  • 2007年09月21日 01:56
  • 1346

在Win7中运行某些软件时,突然提示出错信息“应用程序无法启动,因为应用程序的并行配置不正确。有关详细信息,请参阅应用程序事件日志,或使用命令行sxstrace.exe工具。”

在Win7中运行某些软件时,突然提示出错信息“应用程序无法启动,因为应用程序的并行配置不正确。有关详细信息,请参阅应用程序事件日志,或使用命令行sxstrace.exe工具。” 查看win7应用...
  • GSH_Hello_World
  • GSH_Hello_World
  • 2015年08月04日 20:59
  • 3248
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用.net下的系统事件增强应用程序
举报原因:
原因补充:

(最多只允许输入30个字)