2008-10-23 224 views

回答

3

可以监视Win32_PowerManagementEvent WMI事件

+0

你有代码示例,它可以吗? (尝试了一些在线示例,但他们似乎没有触发该事件) – 2017-03-01 11:45:31

3

不知道你想多久监测一次,但如果你在.NET中编写服务,你可以重写ServiceBase,将CanHandlePowerEvent设置为true,然后通过PowerBroadcastStatus枚举通知你电源变化。

+0

感谢您提及'CanHandlePowerEvent',那是我的问题! – n0ne 2017-10-30 08:02:47

3

在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端口不再有效的迹象。我也不确定与其他进程的接口,例如数据库连接。

除了标准的睡眠和休眠电源管理状态之外,微软还推出了Connected Standby power state with Windows 8 and 8.1,它有一些应用程序设计分支取决于应用程序的类型。

桌面应用通常不需要额外的工作就可以与 连接待机。

桌面活动主持人(DAM)是 在连接待机期间暂停所有桌面应用程序并限制第三方系统服务运行时间的Windows组件。DAM的目的是维持与现有的 应用程序和服务的基本软件兼容性,但是在睡眠期间减轻其对电池寿命的影响 。

在DAM阶段完成后,Windows会阻止桌面应用程序在 连接待机期间的任何部分运行。在允许 完成DAM阶段后,Windows允许 第三方系统服务以节制模式执行。在这种模式下,第三方服务可以运行 ,每30秒不超过一秒的挂钟时间。

The Art of Graceful Application Suspension by Lynn Merrill英特尔大约有处理与电源管理Windows环境下相关的各种Windows消息类型的一些信息,但它是2005年迄今所以不是所有的材料Windows XP后涉及到Windows。本文档中描述的消息序列中至少有一个不再使用的消息是从Windows Vista开始,用于请求应用程序是否能够挂起的PBT_APMQUERYSUSPEND消息不再由Windows使用。现在使用SetThreadExecutionState()函数来指示在休眠或休眠状态发生变化时线程不能中断。有关电源管理状态消息更改的详细信息,请参阅stackoverflow Can't catch sleep suspend messages (winxp)中的答案。

+0

+1不知道关于连接待机,并想知道为什么我的Windows服务在平板电脑上出现故障。非常感谢你! – 2016-04-28 14:13:18

0

您可以订阅NetworkChange.NetworkAvailabilityChanged和NetworkChange.NetworkAddressChanged。

我通常会启动一个两秒钟的定时器,以便在超时后进入睡眠模式后恢复网络通信。