如何检测Windows关闭或注销

And*_*gar 49 .net c# windows winforms system-shutdown

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

我看了帖子c#中是否有办法检测Windows关机/注销并取消该操作(询问用户后)

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

Cod*_*ray 60

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

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

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

  • 您能详细说明为什么需要取消事件吗?您的申请正在结束.什么管理都不会泄漏.非托管内存会保持开放吗? (8认同)
  • @Ultratrunks 你在这里打一场必败的仗。应用程序不能可靠地*防止*系统关闭,它所能做的就是对其做出反应。 (3认同)
  • 有没有办法测试这些事件而不实际关闭或注销? (3认同)
  • 这个线程现在可能已经死了,但是如果你的应用程序在关闭之后启动就会发生什么.这两个事件是否仍然有效,因为技术上你已经错过了它.这是我现在遇到的那种问题.我的应用程序旨在保持运行,并在关闭时尝试重新启动后,它被Windows杀死,准备关闭. (2认同)

c00*_*0fd 11

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

//SM_SHUTTINGDOWN = 0x2000
bool bShutDownPending = GetSystemMetrics(SM_SHUTTINGDOWN) != 0;
Run Code Online (Sandbox Code Playgroud)

  • 当然,请记住,这是一个*轮询*解决方案 - 没有回调,没有事件处理 - 你必须检查,直到满足这个条件. (6认同)
  • 由于存在异步事件驱动的解决方案,因此您不需要使用单独的线程和 CPU 循环来浪费系统资源。 (3认同)