我需要检测Windows何时关闭(或重新启动)或用户何时注销。我需要在应用程序关闭之前正确关闭应用程序。 我注意到,当Windows关闭一天时,不会引发退出应用程序事件。
但是我不确定在关闭之前我应该在哪里执行操作。 感谢。
答案 0 :(得分:53)
Attach an event handler method到SystemEvents.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);
}