我有一项服务,用 C++ 开发,在 Windows 8(和 8.1)上运行。如何得知系统已进入 Connected Standby?
由于这是一项服务,它没有窗口,我应该使用PowerRegisterSuspendResumeNotification,但它似乎不起作用。有谁知道我怎样才能收到这样的通知?
我有一项服务,用 C++ 开发,在 Windows 8(和 8.1)上运行。如何得知系统已进入 Connected Standby?
由于这是一项服务,它没有窗口,我应该使用PowerRegisterSuspendResumeNotification,但它似乎不起作用。有谁知道我怎样才能收到这样的通知?
我已经联系了微软的技术支持。这是他们的回答:
ConnectedStandby 进入/退出没有直接通知,但您可以只使用显示器开/关通知,因为 ConnectedStandby 在支持 AOAC 的系统上是屏幕关闭的同义词(但不在旧系统上,AOAC 功能可以通过获取SystemPowerCapabilities 使用 CallNtPowerInformation 并查看 SYSTEM_POWER_CAPABILITIES 结构的 AoAc 值)。
要获得显示器开/关通知,您可以使用 RegisterPowerSettingNotification 并使用 GUID_MONITOR_POWER_ON 电源设置 GUID。
似乎只有通过收听屏幕开/关事件来解决此问题。
太虐了,无法评论!!
CallNtPowerInformation(SystemPowerCapabilities, ...)
将返回SYSTEM_POWER_CAPABILITIES
。它有一个BOOLEAN
成员AoAc
,如果是FALSE
,你的系统不支持连接待机。
它适用于英特尔定制硬件(与市场上的机器相同)。AoAc
= Always On Always Connected,英特尔的偏好。
迄今为止找不到任何官方解决方案。在我的情况下,检测带有锁定/解锁原因的 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;
}
}
我不被允许发表评论,惊喜被允许提供答案。这不是肯定的回答,而是讨论。
您是否没有收到通知PBT_APMSUSPEND
,PBT_APMRESUMESUSPEND
并且PBT_APMRESUMEAUTOMATIC
在您的回调中?
看来,应用程序不需要区分 S3 和 CS 模式(又名 AOAC,始终开启,始终连接。)。虽然尚不清楚 CS 中是否允许网络活动。