如何检测Windows关机或注销

本文关键字:Windows 关机 注销 检测 何检测 | 更新日期: 2023-09-27 18:03:06

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

在c#中是否有一种方法可以检测Windows关闭/注销并取消该操作(在询问用户之后)

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

如何检测Windows关机或注销

将事件处理程序方法附加到SystemEvents.SessionEnding事件,每次引发事件时将调用您的处理程序方法。处理此事件将允许您取消挂起的注销或关闭,如果您愿意的话。(尽管这在当前的操作系统中并不像听起来那样实际工作;有关更多信息,请参阅此处的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);
}