2012-07-06 128 views
1

我使用C++與WinAPIs編碼,並冬眠我用下面的調用計算機的Windows通知失敗。當休眠失敗

所以我想知道,Windows是否發送任何通知,如果休眠失敗?如果不是,如何判斷我的休眠請求是否失敗?

+0

對於第二個參數('FALSE'在技術上會更加正確,因爲它是'BOOLEAN')使用NULL。應用程序是否有可能阻止該操作,但該函數仍然從中返回「TRUE」? – chris 2012-07-06 23:18:54

+1

看起來像直到Windows 8沒有直接的方式來檢測休眠。但我想你可以閒置循環,並觀看系統時間。如果時間突然向前跳躍,您已經成功休眠(並恢復!),如果這在一分鐘左右沒有發生,請求可能失敗。 – 2012-07-07 05:33:42

+0

您也可以檢查系統是否在休眠失敗時Windows向事件日誌寫入任何內容。如果是這樣,您的應用程序可以監視事件日誌中的相關條目。 – 2012-07-07 05:35:12

回答

1

看起來像沒有直接的方式來檢測休眠[更正:我錯了。見Fowl的答案]直到Windows 8(請參閱PowerRegisterSuspendResumeNotification)。但我想你可以空閒循環並觀察系統時間。如果時間突然向前跳躍,您已經成功休眠(並恢復!),如果這在一分鐘左右沒有發生,請求可能失敗。我認爲你可以使用GetTickCount64函數,它對系統時間變化不敏感,但顯然包括睡眠時間的偏差。如果這不起作用,請使用GetSystemTimeAsFileTime,但也請注意WM_TIMECHANGE消息。

您也可以檢查系統是否在休眠失敗時Windows向事件日誌寫入任何內容。如果是這樣,您的應用程序可以監視事件日誌中的相關條目。這將是一個更可靠的方法。

+0

真的沒有辦法嗎? .NET有http://msdn.microsoft.com/en-us/library/microsoft.win32.systemevents.powermodechanged.aspx – Fowl 2012-07-09 03:21:58

+0

它使用WM_POWERBROADCAST消息,按照http://msdn.microsoft.com/en-us /library/windows/desktop/aa373248%28v=vs.85%29.aspx – 2012-07-09 03:32:24

+0

@Fowl:你應該將其作爲答案發布。 (我也會編輯它。) – 2012-07-09 03:34:30

0

嗯......也許我錯過了這裏的觀點,但根據文檔,如果失敗,它應該返回FALSE。它仍然在你的情況下返回TRUE?

+0

看起來是這樣。在Windows中發生的是該過程開始,然後簡單地退出,我再次看到桌面... – ahmd0 2012-07-06 22:28:10

1

註冊(RegisterPowerSettingNotification),然後偵聽WM_POWERBROADCAST,然後詢問事件日誌以獲取更多詳細信息。

如果你想處理多個操作系統版本,但是它是可行的,

+0

謝謝,但「詢問事件日誌以獲取更多詳細信息」聽起來像是一個IT技術支持過度電話的好建議,但是在自動代碼中實施是一個有爭議的問題... – ahmd0 2012-07-10 06:55:38

+1

您可以詢問來自應用程序的事件日誌。在MSDN中搜索OpenEventLog。 – 2012-07-10 20:38:26