如何检测Windows关闭或注销

时间:2011-07-23 10:59:54

标签: c# .net windows winforms system-shutdown

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

我阅读了帖子Is there a way in c# to detect a Windows shutdown/logoff and cancel that action (after asking the user)

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

3 个答案:

答案 0 :(得分:53)

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

如果您不想取消该活动,只是恰当地对其做出反应,则应该处理SystemEvents.SessionEnded event

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

答案 1 :(得分:9)

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

//SM_SHUTTINGDOWN = 0x2000
bool bShutDownPending = GetSystemMetrics(SM_SHUTTINGDOWN) != 0;

答案 2 :(得分: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);
}