Connected standby notification for a W8 Service

2020-02-26 08:59发布

I have a service, developed in C++ running on Windows 8 (and 8.1). How can I get to know that the system has entered Connected Standby?

Since this is a service, it does not have a window, I should be using PowerRegisterSuspendResumeNotification, but it does not seem to be working. Does anyone know how I can get such a notification?

4条回答
爷的心禁止访问
2楼-- · 2020-02-26 09:34

This is excruciating unable to comment!!

CallNtPowerInformation(SystemPowerCapabilities, ...) will return SYSTEM_POWER_CAPABILITIES. It has an BOOLEAN member AoAc, if it is FALSE, your system does not support connected standby.

It worked for me on an Intel custom hardware(same as machines in market). AoAc = Always On Always Connected, Intel's preference.

查看更多
仙女界的扛把子
3楼-- · 2020-02-26 09:39

I was not allowed to comment, surprise am allowed to provide answer. This not answer definitely, but discussion.

Do you not receive notification for PBT_APMSUSPEND, PBT_APMRESUMESUSPEND and PBT_APMRESUMEAUTOMATIC in you callback?

After going through http://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/26629db2-6d33-427c-a767-8c857d775079/windows-8-connected-standby-and-aoac?forum=wdk

it appears, applications need not differentiate between S3 and CS mode(a.k.a AOAC, always on, always connected.). Though it is not clear if network activity is allowed in CS.

查看更多
爷的心禁止访问
4楼-- · 2020-02-26 09:40

Couldn't find any offical solution of this to date. In my case detecting SessionSwitch with lock/unlock reasons was a good enough supplement:

SystemEvents.SessionSwitch += SystemEvents_SessionSwitch;

...

private void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e)
    {
        switch (e.Reason)
        {
            case SessionSwitchReason.SessionLock:
                // Going into lock/standby screen
                break;
            case SessionSwitchReason.SessionUnlock:
                // Back from lock/standby
                break;
            default:
                break;
        }
    }
查看更多
姐就是有狂的资本
5楼-- · 2020-02-26 09:43

I have contacted Microsoft's technical support. This is their answer:

There are no direct notifications for ConnectedStandby enter/exit, but you can just use the monitor on/off notifications since ConnectedStandby is synonymous with screen off on an AOAC capable system (but is not on a legacy system, AOAC capability can be had by getting SystemPowerCapabilities using CallNtPowerInformation and looking at the AoAc value of the SYSTEM_POWER_CAPABILITIES struct).

To get monitor on/off notifications you can use RegisterPowerSettingNotification and use the GUID_MONITOR_POWER_ON power setting GUID.

Looks like there is only a workaround for this by listening to screen on/off events.

查看更多
登录 后发表回答