【发布时间】:2021-08-19 19:07:03
【问题描述】:
我正在生成一个 C# windows 服务来记录特定的 windows 事件。虽然它们中的大多数都很好(登录/关闭、锁定/解锁等),但我在 Windows 关机类型事件方面遇到了一些问题。我正在尝试的代码如下(摘自其他地方的其他建议)。
对于服务:-
public Service()
{
InitializeComponent();
SystemEvents.SessionEnded += new SessionEndedEventHandler(SystemEvents_SessionEnded);
SystemEvents.PowerModeChanged += new PowerModeChangedEventHandler(SystemEvents_PowerModeChanged);
}
对于 SystemEvents_SessionEnded :-
void SystemEvents_SessionEnded(object sender, SessionEndedEventArgs e)
{
switch (e.Reason)
{
case SessionEndReasons.SystemShutdown:
eventType = 7;
break;
case SessionEndReasons.Logoff:
eventType = 2;
break;
default:
break;
}
\\Send eventType and current DateTime to remote API
}
对于 SystemEvents_PowerModeChanged
static void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e)
{
switch (e.Mode)
{
case PowerModes.Suspend:
eventType = 5;
break;
case PowerModes.Resume:
eventType = 6;
break;
default:
break;
}
\\Send eventType and current Datetime to API
}
由于 API 托管在本地计算机的外部,我假设我的服务依赖于其他人通过网络发送数据?关于是否是我的代码失败或我是否需要更好的依赖项设置的任何建议?
提前致谢。
【问题讨论】:
-
SessionEnded Docs 说 仅当消息泵正在运行时才会引发此事件。 在 Windows 服务中,除非使用隐藏表单或手动启动消息泵,否则不会引发此事件。 示例代码显示如何使用隐藏表单处理系统事件在 Windows 服务中,请参阅 SystemEvents 类。
-
太好了,感谢您提供的信息,我已将代码移至第二个链接中提供的结构中,现在正在触发。