2012-01-28 227 views
3

我正在製作一個隨機運行在我們每臺PC上的應用程序。它工作正常,但是如果PC當前正在關閉,那麼我無法讀取WMI,並且出現一些錯誤。所以我需要確定一臺PC是否正在關閉,所以我可以避免這些錯誤。有沒有人有一個idee?如何以編程方式確定Windows是否正在關機?

謝謝!

+0

可能重複的[如何檢測Windows關機或註銷](http://stackoverflow.com/questions/6799955/how-to-detect-windows-shutdown-or-logoff) – 2012-01-28 22:47:24

+0

@BobKaufman如果實際上不重複關於c,而不是c#。 – GSerg 2012-01-28 22:50:14

回答

2

創建一個隱藏的頂級窗口並收聽WM_ENDSESSION消息。 wParam的值將告訴您整個系統是否正在關閉,或者用戶是否註銷。

如果您的應用程序是控制檯應用程序,然後使用SetConsoleCtrlHandler進行註冊以接收關閉通知。

+0

如果您的應用程序是服務,然後使用[RegisterServiceCtrlHandlerEx](http://msdn.microsoft.com/en-us/library/windows/desktop/ms685058.aspx)。 – Neil 2012-01-28 23:36:47

+0

供參考:雖然此建議通常會起作用 - 但在某些情況下也會失敗。由於Windows不會將WM_ENDSESSION廣播到應用程序的所有窗口,因此無法保證哪個窗口將接收消息(在多窗口應用程序中)。 – SilverKnight 2013-01-04 17:47:13

2

檢測到這種情況的任何嘗試都會產生競爭狀態:系統關閉可能會在檢測到它沒有關閉後立即啓動,但在嘗試執行在關閉期間不起作用的操作之前可能會立即啓動。因此,您解決問題的方法是錯誤的。相反,您只需要處理WMI讀取失敗,並確定它們是否由系統關閉導致,並且在這種情況下中止操作或以任何其他方式進行操作。

可能有可能使用一種同步關機檢測機制,在這種機制中,您可以在進行之前實際鎖定/延遲關機一段時間,然後在該間隔內進行處理。如果是這樣,那也是沒有競爭條件的安全方法。

+2

當您收到關機通知時,您只需退出應用程序。我不明白爲什麼會有比賽。您確實可以通過處理通知消息來阻止關機。 – 2012-01-28 23:41:26

4

索引爲SM_SHUTTINGDOWN(0x2000)的調用GetSystemMetrics

+0

在我們類似的情況下,這似乎是所問問題的實際解決方案。 – SilverKnight 2013-01-04 17:49:41

相關問題