是否有可能订阅Windows进入或hibernate或hibernate状态时触发的Windows事件?
我需要让我的应用程序知道计算机什么时候睡觉来做一些清理工作,并在睡眠时避免计时问题。
Microsoft.Win32.SystemEvents.PowerModeChanged
事件会给你这个信息。 微软到目前为止,.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端口不再有效。 我也不确定与其他进程的接口,例如数据库连接。
除了标准的睡眠和休眠电源管理状态之外,微软还推出了Windows 8和8.1的Connected Standby电源状态,这些状态在应用程序类型上有一些应用程序设计分支。
桌面应用程序通常不需要额外的工作就可以与连接待机进行集成
桌面活动主持人(DAM)是一个Windows组件,可在连接待机期间暂停所有桌面应用程序并限制第三方系统服务的运行时间。 DAM的目的是保持与现有应用程序和服务的基本软件兼容性,但是减少它们在睡眠期间对电池寿命的影响。
在DAM阶段完成后,Windows会阻止桌面应用程序在连接待机的任何部分中运行。 在完成DAM阶段后,Windows允许第三方系统服务以节制模式执行。 在此模式下,第三方服务每30秒钟可以运行不超过一秒的挂钟时间。
来自Intel 的Lynn Merrill的优雅应用程序暂停的艺术有一些关于在Windows下处理与电源管理有关的各种Windows消息类型的信息,但是它是2005年的日期,所以在Windows XP之后并不是所有的材料都可以与Windows相关。 在本文档中描述的消息序列中至少有一个不再使用的消息是从Windows Vista开始,用于请求应用程序是否能够挂起的PBT_APMQUERYSUSPEND
消息不再由Windows使用。 SetThreadExecutionState()
函数现在用于指示一个线程不会因为更改睡眠或休眠状态而中断。 请参阅stackoverflow中的答案有关电源管理状态消息更改的详细信息, 无法捕获睡眠暂挂消息(winxp) 。
您可以订阅NetworkChange.NetworkAvailabilityChanged和NetworkChange.NetworkAddressChanged。
我通常会启动一个两秒钟的定时器,以便在超时后进入休眠模式后恢复网络通讯。