10

我有一项服务,用 C++ 开发,在 Windows 8(和 8.1)上运行。如何得知系统已进入 Connected Standby?

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

4

4 回答 4

6

我已经联系了微软的技术支持。这是他们的回答:

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

要获得显示器开/关通知,您可以使用 RegisterPowerSettingNotification 并使用 GUID_MONITOR_POWER_ON 电源设置 GUID。

似乎只有通过收听屏幕开/关事件来解决此问题。

于 2014-03-19T14:36:04.730 回答
2

太虐了,无法评论!!

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

它适用于英特尔定制硬件(与市场上的机器相同)。AoAc= Always On Always Connected,英特尔的偏好。

于 2014-02-20T17:12:44.217 回答
1

迄今为止找不到任何官方解决方案。在我的情况下,检测带有锁定/解锁原因的 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;
        }
    }
于 2019-04-14T14:10:41.790 回答
0

我不被允许发表评论,惊喜被允许提供答案。这不是肯定的回答,而是讨论。

您是否没有收到通知PBT_APMSUSPENDPBT_APMRESUMESUSPEND并且PBT_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 模式(又名 AOAC,始终开启,始终连接。)。虽然尚不清楚 CS 中是否允许网络活动。

于 2014-02-17T04:59:56.310 回答