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