如何在Windows服务中检测从睡眠模式唤醒?

时间:2017-12-22 13:56:06

标签: c++ winapi

美好的一天!我写了一个Windows服务,它检测USB闪存驱动器连接并对连接的驱动器执行某些操作。现在经过测试后,我需要在从睡眠模式唤醒后重新处理设备。当服务工作作为Windows程序时,我解决了这个问题。要解决我另外处理DBT_DEVNODES_CHANGED,但服务没有收到此消息,它只会收到DBT_DEVICE_ARRIVALDBT_DEVICEREMOVECOMPLETE。我还尝试检查除SERVICE_CONTROL_DEVICEEVENTSERVICE_CONTROL_STOP之外的服务处理的所有消息,当系统进入休眠状态时我没有收到任何消息。

如何确定系统何时醒来?

2 个答案:

答案 0 :(得分:4)

普通应用程序收到WM_POWERBROADCAST:PBT_APMRESUMEAUTOMATIC窗口消息,但如果没有窗口,服务将不会收到此消息。但是,服务可以在其HandlerEx回调函数中接收SERVICE_CONTROL_POWEREVENT,其参数与WM_POWERBROADCAST相同

  

通知服务系统电源事件。 dwEventType参数包含其他信息。如果dwEventType是PBT_POWERSETTINGCHANGE,则lpEventData参数还包含其他信息。

在Windows 8及更高版本中,您还可以使用PowerRegisterSuspendResumeNotification()功能:

  

注册以在系统暂停或恢复时接收通知。

相当于WM_DEVICECHANGE的服务是SERVICE_CONTROL_DEVICEEVENT

  

通知服务设备事件。 (该服务必须已注册才能使用RegisterDeviceNotification函数接收这些通知。)dwEventType和lpEventData参数包含其他信息。

答案 1 :(得分:0)

检测系统唤醒的最佳方法是处理能力消息。 Windows必须处理WM_POWERBROADCAST 服务必须SERVICE_ACCEPT_POWEREVENT添加SetServiceStatus的最后一次通话并处理SERVICE_CONTROL_POWEREVENT

我的错误非常愚蠢。我忘记添加SERVICE_ACCEPT_POWEREVENT