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

Abd*_*lil 5 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); 
  } 
} 
Run Code Online (Sandbox Code Playgroud)

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

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

nit*_*one 6

使您的服务依赖于TermService(终端服务服务).在封面下,SystemEvents类基于WTSRegisterSessionNotification Win32函数,如果终端服务服务在调用时尚未启动,则该函数会记录为失败.通过将TermService的依赖性添加到您的服务,这将不会发生.你也可以使用类似的技术连接到Internet\TermSrvReadyEvent全球性事件并等待注册SystemEvent处理,直到TS"准备就绪"事件触发.