簡體   English   中英

我如何知道Windows何時進入/退出睡眠模式或休眠模式?

[英]How can I know when Windows is going into/out of sleep or Hibernate mode?

是否可以訂閱Windows進入或退出睡眠或休眠狀態時觸發的Windows事件?

我需要讓我的應用程序在計算機進入睡眠狀態時進行清理並避免在睡眠時出現計時問題。

Microsoft.Win32.SystemEvents.PowerModeChanged事件將為您提供此信息。 到目前為止,Microsoft發布的.NET框架的所有變體都提供此事件。

在.NET中,使用PowerModeChanged事件。 在Win32中,使用WM_POWERBROADCAST消息。

您可以監視Win32_PowerManagementEvent WMI事件

不確定您希望監視此頻率的頻率,但如果您在.NET中編寫服務,則可以覆蓋ServiceBase,將CanHandlePowerEvent設置為true,然后通過PowerBroadcastStatus枚舉通知您電源更改。

在Visual Studio 2005 C ++ MFC應用程序中,您需要在消息映射中添加ON_MESSAGE()以查找WM_POWERBROADCAST消息,如下例所示:

BEGIN_MESSAGE_MAP(CFrameworkWndDoc, CWindowDocument)
    //{{AFX_MSG_MAP(CFrameworkWndDoc)
    ON_WM_CHAR()
    ON_WM_TIMER()
    //}}AFX_MSG_MAP
    ON_MESSAGE(WM_POWERBROADCAST, OnPowerMsgRcvd)
END_MESSAGE_MAP()

然后,您需要添加消息處理函數以及類定義更改,以聲明消息處理程序的成員函數,以便您可以檢查消息類型的wParam變量,如此骨架中所示:

// Handle the WM_POWERBROADCAST message to process a message concerning power management
// such as going to Sleep or Waking Up.
LRESULT CFrameworkWndDoc::OnPowerMsgRcvd(WPARAM wParam, LPARAM lParam)
{
    switch (wParam) {
        case PBT_APMPOWERSTATUSCHANGE:
            TRACE0("PBT_APMPOWERSTATUSCHANGE  received\n");
            break;
        case PBT_APMRESUMEAUTOMATIC:
            TRACE0("PBT_APMRESUMEAUTOMATIC  received\n");
            break;
        case PBT_APMRESUMESUSPEND:
            TRACE0("PBT_APMRESUMESUSPEND  received\n");
            break;
        case PBT_APMSUSPEND:
            TRACE0("PBT_APMSUSPEND  received\n");
            break;
    }

    return 0;
}

我所看到的是,在調試器中啟動的Windows 7上運行的應用程序中使用上述測試,然后我手動使我的PC運行應用程序到睡眠我將看到以下消息:

PBT_APMSUSPEND  received

然后當PC重新啟動並且我在調試器輸出窗口中登錄時會看到兩個消息:

PBT_APMRESUMESUSPEND  received
PBT_APMRESUMEAUTOMATIC  received

到目前為止我發現的所有內容都表明您沒有跡象表明您是否已退出睡眠狀態或休眠狀態。 我還在進行進一步的研究,研究在暫停或恢復文件和設備句柄時需要做什么。 我看到有跡象表明COM端口的文件句柄在恢復后不再有效。 我也不確定與其他進程的接口,例如數據庫連接。

除了標准的睡眠和休眠電源管理狀態之外,Microsoft還引入了Windows 8和8.1Connected Standby電源狀態,根據應用程序的類型,它具有一些應用程序設計的后果。

桌面應用程序通常不需要額外的工作就可以與連接的備用數

桌面活動主持人(DAM)是Windows組件,它會暫停所有桌面應用程序並在連接待機期間限制第三方系統服務的運行時。 DAM的目的是保持與現有應用程序和服務的基本軟件兼容性,但減輕它們在睡眠期間對電池壽命的影響。

在DAM階段完成后,Windows會阻止桌面應用程序在連接待機的任何部分運行。 Windows允許第三方系統服務在完成DAM階段后以限制模式執行。 在此模式下,第三方服務每隔30秒可以運行不超過一秒的掛鍾時間。

來自英特爾的Lynn Merrill的優雅應用暫停藝術有一些關於在Windows下處理與Power Management相關的各種Windows消息類型的信息,但它是2005年的日期,因此在Windows XP之后並非所有材料都與Windows有關。 在本文檔中描述的消息序列中至少有一條不再使用的消息,從Windows Vista開始,用於請求應用程序是否能夠掛起的PBT_APMQUERYSUSPEND消息不再被Windows使用。 SetThreadExecutionState()函數現在用於指示線程不能通過更改Sleep或Hibernate狀態來中斷。 請參閱stackoverflow中的答案無法捕獲睡眠暫停消息(winxp)以獲取有關電源管理狀態消息更改的詳細信息。

您可以訂閱NetworkChange.NetworkAvailabilityChanged和NetworkChange.NetworkAddressChanged。

我通常會啟動一個兩秒鍾的計時器,以便在超時后處於睡眠模式時恢復網絡通信。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM