我正在编写一个C# .NET 3.5 Windows服务,需要在用户登录或解锁事件发生时执行一些操作。我尝试通过将我的事件处理程序添加到Microsoft.Win32.SystemEvents.SessionSwitch来注册服务:
using Microsoft.Win32;
SystemEvents.SessionSwitch += new SessionSwitchEventHandler(SystemEvents_SessionSwitch);
void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e)
{
if (e.Reason == SessionSwitchReason.SessionLogon)
{
// Do Task
}
else if (e.Reason == SessionSwitchReason.SessionUnlock)
{
// Do Task
}
}
我尝试覆盖由ServiceBase
类继承的OnSessionChange(SessionChangeDescription changeDescription) {...}
方法:
protected override void OnSessionChange(SessionChangeDescription changeDescription)
{
if (changeDescription.Reason == SessionChangeReason.SessionLogon)
{
// Do Task
}
else if (changeDescription.Reason == SessionChangeReason.SessionUnlock)
{
// Do Task
}
base.OnSessionChange(changeDescription);
}
很多会话事件由上述方法之一处理,不幸的是,当快速用户切换和终端服务停止和禁用时,这些方法都无法处理会话解锁事件。然而,当两个服务都启用并运行时,该事件将得到处理。在部署本工作环境时,这两个服务将被禁用。
在C#.NET托管代码环境中是否有其他方法可以实现此操作?我看到很多问题都用上述方法回答了这个问题,它们确实可以正常工作,但当快速用户切换和终端服务都禁用时就无法正常工作了。