W8服务的已连接待机通知

时间:2013-11-21 11:06:52

标签: c++ windows service standby

我有一个在Windows 8(和8.1)上运行的C ++开发的服务。如何才能知道系统已进入Connected Standby?

由于这是一项服务,它没有窗口,我应该使用PowerRegisterSuspendResumeNotification,但它似乎不起作用。有谁知道我怎么得到这样的通知?

4 个答案:

答案 0 :(得分:4)

我已联系过Microsoft的技术支持。这是他们的答案:

  

没有针对ConnectedStandby进入/退出的直接通知,但您可以使用监视器开/关通知,因为ConnectedStandby与支持AOAC的系统上的屏幕关闭同义(但不在遗留系统上,AOAC功能可以是通过使用CallNtPowerInformation获取SystemPowerCapabilities并查看SYSTEM_POWER_CAPABILITIES结构的AoAc值。)

     

要获取监视器开/关通知,您可以使用RegisterPowerSettingNotification并使用GUID_MONITOR_POWER_ON电源设置GUID。

通过收听屏幕开/关事件,看起来只有一种解决方法。

答案 1 :(得分:2)

这令人痛苦无法评论!!

CallNtPowerInformation(SystemPowerCapabilities, ...)将返回SYSTEM_POWER_CAPABILITIES。它有一个BOOLEAN成员AoAc,如果是FALSE,则您的系统不支持已连接的待机状态。

它适用于英特尔定制硬件(与市场上的机器相同)。 AoAc =始终保持连接状态,英特尔的偏好。

答案 2 :(得分:0)

我不被允许发表评论,我很高兴能够提供答案。这不是肯定的答案,而是讨论。

在回调中,您是否收到PBT_APMSUSPENDPBT_APMRESUMESUSPENDPBT_APMRESUMEAUTOMATIC的通知?

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

之后

看来,应用程序无需区分S3和CS模式(a.k.a AOAC,始终打开,始终连接)。虽然不清楚CS中是否允许网络活动。

答案 3 :(得分:0)

迄今为止找不到任何官方解决方案。就我而言,检测具有锁定/解锁原因的SessionSwitch是一个很好的补充:

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;
        }
    }