我有一个在Windows 8(和8.1)上运行的C ++开发的服务。如何才能知道系统已进入Connected Standby?
由于这是一项服务,它没有窗口,我应该使用PowerRegisterSuspendResumeNotification,但它似乎不起作用。有谁知道我怎么得到这样的通知?
答案 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_APMSUSPEND
,PBT_APMRESUMESUSPEND
和PBT_APMRESUMEAUTOMATIC
的通知?
看来,应用程序无需区分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;
}
}