我正在製作一個隨機運行在我們每臺PC上的應用程序。它工作正常,但是如果PC當前正在關閉,那麼我無法讀取WMI,並且出現一些錯誤。所以我需要確定一臺PC是否正在關閉,所以我可以避免這些錯誤。有沒有人有一個idee?如何以編程方式確定Windows是否正在關機?
謝謝!
我正在製作一個隨機運行在我們每臺PC上的應用程序。它工作正常,但是如果PC當前正在關閉,那麼我無法讀取WMI,並且出現一些錯誤。所以我需要確定一臺PC是否正在關閉,所以我可以避免這些錯誤。有沒有人有一個idee?如何以編程方式確定Windows是否正在關機?
謝謝!
創建一個隱藏的頂級窗口並收聽WM_ENDSESSION
消息。 wParam
的值將告訴您整個系統是否正在關閉,或者用戶是否註銷。
如果您的應用程序是控制檯應用程序,然後使用SetConsoleCtrlHandler
進行註冊以接收關閉通知。
如果您的應用程序是服務,然後使用[RegisterServiceCtrlHandlerEx](http://msdn.microsoft.com/en-us/library/windows/desktop/ms685058.aspx)。 – Neil 2012-01-28 23:36:47
供參考:雖然此建議通常會起作用 - 但在某些情況下也會失敗。由於Windows不會將WM_ENDSESSION廣播到應用程序的所有窗口,因此無法保證哪個窗口將接收消息(在多窗口應用程序中)。 – SilverKnight 2013-01-04 17:47:13
檢測到這種情況的任何嘗試都會產生競爭狀態:系統關閉可能會在檢測到它沒有關閉後立即啓動,但在嘗試執行在關閉期間不起作用的操作之前可能會立即啓動。因此,您解決問題的方法是錯誤的。相反,您只需要處理WMI讀取失敗,並確定它們是否由系統關閉導致,並且在這種情況下中止操作或以任何其他方式進行操作。
可能有可能使用一種同步關機檢測機制,在這種機制中,您可以在進行之前實際鎖定/延遲關機一段時間,然後在該間隔內進行處理。如果是這樣,那也是沒有競爭條件的安全方法。
當您收到關機通知時,您只需退出應用程序。我不明白爲什麼會有比賽。您確實可以通過處理通知消息來阻止關機。 – 2012-01-28 23:41:26
索引爲SM_SHUTTINGDOWN(0x2000)的調用GetSystemMetrics。
在我們類似的情況下,這似乎是所問問題的實際解決方案。 – SilverKnight 2013-01-04 17:49:41
可能重複的[如何檢測Windows關機或註銷](http://stackoverflow.com/questions/6799955/how-to-detect-windows-shutdown-or-logoff) – 2012-01-28 22:47:24
@BobKaufman如果實際上不重複關於c,而不是c#。 – GSerg 2012-01-28 22:50:14