c++winapi

How to detect by regular Win32 program, that the system just came out of sleep


I need to adjust something by a regular desktop program (not a service) when the system emerges from a sleep state. I expected that the program would get a WM_POWERBROADCAST message, but this message is never received.

According to How can I know when Windows is going into/out of sleep or Hibernate mode?, this message is expected without any preconditions.

Tested on Windows 11 with a simple Win32 program, generated by Visual Studio. Just added to the message loop "case WM_POWERBROADCAST:", which sets some static variable. After waking up from sleep, the variable is untouched.

You can verify with Spy++: there are only multiple WM_DEVICECHANGE messages, plus 0x02C8 and 0x02C9 messages, and repainting messages.

The workaround is to constantly poll the system with, for example, GetTickCount64(), and detect periods of inaction. Of course, better to avoid polling.

If you know something about it, please let me know what I am missing!


Solution

  • You have to register before you will get WM_POWERBROADCAST messages.

    Take a look at Registering for Power Events, you will see that you need to call RegisterPowerSettingNotification() in order to get WM_POWERBROADCAST.

    UPDATE: there is also RegisterSuspendResumeNotification() as well.