我需要检测 Windows 何时关闭(或重新启动)或用户何时注销。我需要在关闭应用程序之前正确关闭应用程序。我注意到当 Windows 关闭日时没有引发退出应用程序事件。
我读了帖子Is there a way in c# to detection a Windows shutdown/logoff and cancel that action (在询问用户之后)
但我不确定在关闭之前我应该在哪里执行操作。谢谢。
我需要检测 Windows 何时关闭(或重新启动)或用户何时注销。我需要在关闭应用程序之前正确关闭应用程序。我注意到当 Windows 关闭日时没有引发退出应用程序事件。
我读了帖子Is there a way in c# to detection a Windows shutdown/logoff and cancel that action (在询问用户之后)
但我不确定在关闭之前我应该在哪里执行操作。谢谢。
将事件处理程序方法附加到SystemEvents.SessionEnding
event,每次引发事件时都会调用您的处理程序方法。如果您愿意,处理此事件将允许您取消挂起的注销或关闭。(虽然这实际上不像在当前操作系统中听起来那样有效;有关更多信息,请参阅此处的 MSDN 文档。)
如果您不想取消该事件,而只是对其做出适当的反应,则应改为处理该SystemEvents.SessionEnded
事件。
但是,您必须确保在应用程序关闭时分离事件处理程序,因为这两个都是静态事件。
如果您的代码未在非交互式会话(例如系统服务)中运行,您可以通过pinvoke使用本机解决方案:
//SM_SHUTTINGDOWN = 0x2000
bool bShutDownPending = GetSystemMetrics(SM_SHUTTINGDOWN) != 0;
现在你应该使用这样的东西:
private static int WM_QUERYENDSESSION = 0x11;
protected override void WndProc(ref System.Windows.Forms.Message m)
{
if (m.Msg==WM_QUERYENDSESSION)
{
MessageBox.Show("queryendsession: this is a logoff, shutdown, or reboot");
}
base.WndProc(ref m);
}