53

我需要检测 Windows 何时关闭(或重新启动)或用户何时注销。我需要在关闭应用程序之前正确关闭应用程序。我注意到当 Windows 关闭日时没有引发退出应用程序事件。

我读了帖子Is there a way in c# to detection a Windows shutdown/logoff and cancel that action (在询问用户之后)

但我不确定在关闭之前我应该​​在哪里执行操作。谢谢。

4

3 回答 3

68

将事件处理程序方法附加SystemEvents.SessionEndingevent,每次引发事件时都会调用您的处理程序方法。如果您愿意,处理此事件将允许您取消挂起的注销或关闭。(虽然这实际上不像在当前操作系统中听起来那样有效;有关更多信息,请参阅此处的 MSDN 文档。)

如果您不想取消该事件,而只是对其做出适当的反应,则应改为处理该SystemEvents.SessionEnded事件

但是,您必须确保在应用程序关闭时分离事件处理程序,因为这两个都是静态事件。

于 2011-07-23T11:02:31.653 回答
12

如果您的代码未在非交互式会话(例如系统服务)中运行,您可以通过pinvoke使用本机解决方案:

//SM_SHUTTINGDOWN = 0x2000
bool bShutDownPending = GetSystemMetrics(SM_SHUTTINGDOWN) != 0;
于 2013-10-14T06:59:50.720 回答
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);
}
于 2021-01-12T13:25:58.250 回答