如何从服务中可靠地捕获Windows登录,注销,锁定和解锁事件?

时间:2009-10-06 14:55:16

标签: c# events windows-services

using Microsoft.Win32; 

public class App 
{ 
  static void Main() 
  { 
    SystemEvents.SessionSwitch += SystemEvents_SessionSwitch; 
    Console.ReadLine();  
    SystemEvents.SessionSwitch -= SystemEvents_SessionSwitch; 
  } 

  static void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e) 
  { 
  if(e.Reason == SessionSwitchReason.SessionLock) 
  { 
    Console.WriteLine("locked at {0}", DateTime.Now); 
  } 
  if(e.Reason == SessionSwitchReason.SessionUnlock) 
  { 
    Console.WriteLine("unlocked at {0}", DateTime.Now); 
  } 
} 

我创建了一个Windows服务。当我重新启动系统并登录,注销,锁定或解锁会话时。它不会捕获事件。该服务正在运行,但无法正常运行。

当我重新启动服务时,它将按预期捕获所有事件。如何进行故障排除/修复?

2 个答案:

答案 0 :(得分:6)

使您的服务依赖于TermService(终端服务服务)。在封面下,SystemEvents类基于WTSRegisterSessionNotification Win32函数,如果终端服务服务在调用时尚未启动,则is documented将失败。通过将TermService的依赖性添加到您的服务,这将不会发生。您还可以使用this之类的技术连接到Global \ TermSrvReadyEvent全局事件,并等待注册SystemEvent处理程序,直到TS“就绪”事件触发为止。

答案 1 :(得分:0)

尝试注册事件而不是在readline之后将其删除 您正在注册,然后立即取消注册,这是没有意义的。