关于C#服务里面的OnSessionChange
来源:互联网 发布:单手模式软件 编辑:程序博客网 时间:2024/05/16 18:39
此文档假设你已会C和C#的服务编程了。
以前我在写服务程序的时候,SCM有一个很酷的功能,能接收WinLogon的Notify消息。具体操作是,设置服务状态的时候,把SERVICE_STATUS结构体变量的dwControlsAccepted参数设成包含SERVICE_ACCEPT_SESSIONCHANGE的异或(代码一),然后就能在HandleEx函数里处理了(代码2)。你可以方便地获得系统的Logon、LogOff、Lock、Unlock的消息,并在此时机做出自己的处理。例如开始菜单里面“启动”项里的程序,如果你要模拟实现会有很多种方法,服务就是其中的一种。再比如你要在系统登出的时候做一些处理,服务几乎是最佳的选择。
代码一:
MyServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN|
SERVICE_ACCEPT_PAUSE_CONTINUE | SERVICE_ACCEPT_SESSIONCHANGE;
代码2:
VOID HandlerEx(DWORD controlCode,
DWORD dwEventType,
LPVOID lpEventData,
LPVOID lpContext)
{
switch(controlCode)
{
case SERVICE_CONTROL_SESSIONCHANGE:
switch(dwEventType)
{
case WTS_SESSION_LOGOFF:
// Logoff
break;
case WTS_SESSION_LOGON:
//LogOn Message
break;
case WTS_SESSION_LOCK:
//Lock Message
break;
case WTS_SESSION_UNLOCK:
//Unlock Message
break;
default:
break;
}
break;
}
后来我碰巧接手了一个C#的服务,我第一次看到用C#写的服务,大吃一惊,像外星人见到了地球人一样!怎么有这么怪的东西啊!没有HandleEx函数,取而代之的是一个个OnStart、OnStop、OnShutDown函数。我试着寻找有没有类似OnSessionChange的函数,在.net 2.0里面被我找到了,而奇怪的是,.net 1.0里面竟然没有,并且即便2.0里面有此函数,它所支持的系统竟然不包括Win2000!这足以说明.net的体质不健康,和“比较”畸形!对于第一个1.1不支持的问题,我的一位同事曾尝试着用重载OnCustomCommand的方法来模拟实现,他用反编译工具看源代码,发现1.1基类里面ServiceBase::OnCustomCommand调用了另一个“保护”方法,而这个方法对OnSessionChage消息不做处理,忽视,从而使得C#的服务从根本上不能处理WinLogOn消息——基类的保护方法不能重载(注意WinLogOn消息是一定能够接受到的,因为消息的发送仅仅由SCM来决定,它是做群发的)。
好,现在来看看2.0里面应该怎么做吧!
好像在C服务里面设置dwControlsAccepted一样,在InitializeComponent()方法里面设置类变量的值:this.CanHandleSessionChangeEvent = true;这样服务接收SessionChage的功能就有效了。下面来看接收WinLogOn消息的实现代码,OnSessionChage函数:
代码三:
protected override void OnSessionChange(SessionChangeDescription Description)
{
try
{
switch(Description.Reason)
case SessionChangeReason.SessionLogoff:
//…
break;
default:
break;
}
catch (Exception ex)
{
Log.Error(func + ex.Message + "/r/n" + ex.StackTrace);
}
}
同样,你可以在接受到消息的时候做许多你想要做的事情。注意,此功能你不能用于Win2K Pro。
- 关于C#服务里面的OnSessionChange
- 关于C#服务里面的OnSessionChange
- 管理里面的服务
- 关于在c#里面调用win api的方法
- 关于C#里面char和Int的转换
- 关于C#里面socket编程的一点理解
- C#关于TreeView里面拖拽的一些问题
- C#里面的数据类型
- c#里面的覆盖
- 关掉服务里面的Tomcat
- 绑定服务&调用服务里面的方法
- 关于在Eclipse里面启动了服务,但是localhost:8080无法访问的问题
- 关于C#下面windows服务读取注册表的问题
- 关于C#创建windows服务的测试与总结
- 谈谈C#里面的Delegate
- 谈谈C#里面的Delegate
- C# 里面的编码问题
- c#里面的namespace基础
- 今天咱们在自动化测试方面获得了公司2009 Quality Excellence Award
- 用JavaScript的日期对象操控时间和日期值
- C# 线程的问题之:竞态条件
- sqlserver 数据库分页--公式问题
- windows默认共享的打开和关闭
- 关于C#服务里面的OnSessionChange
- 打造高效的跨平台的OpenOffice.org开发环境之二--Emacs 24的编译与安装
- 网页特效:在任何位置显示html菜单
- 定时关机
- linux 中断机制的处理过程
- 网页特效----HTML中树的实现方法
- 清华某博士的退学申请【转】
- dmidecode命令简介
- Oracle表空间的管理