关于C#服务里面的OnSessionChange

  
此文档假设你已会C和C#的服务编程了。
以前我在写服务程序的时候,SCM有一个很酷的功能,能接收WinLogon的Notify消息。具体操作是,在设置服务状态时让SERVICE_STATUS结构体变量的参数dwControlsAccepted包含掩码位 SERVICE_ACCEPT_SESSIONCHANGE (见代码一),然后 HandleEx 函数就能接收到WinLogon的Notify了(见代码 2 )。WinLogon的Notify消息包括Session的 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变量的设置,在C#类的 InitializeComponent()方法设置接受WinLogon的Notify消息:
    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);
            }
        }
 
    在OnSessionChange里面,你可以操作各种WinLogon的Notify消息,和C程序的服务相同(但C#的此功能仍不能用于 Win2K )。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值