W8服务的已连接待机通知
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了W8服务的已连接待机通知相关的知识,希望对你有一定的参考价值。
我有一个在Windows 8(和8.1)上运行的C ++开发的服务。如何才能知道系统已进入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,英特尔的偏好。
我不被允许发表评论,惊讶我可以提供答案。这不是肯定的答案,而是讨论。
你在回调中没有收到PBT_APMSUSPEND
,PBT_APMRESUMESUSPEND
和PBT_APMRESUMEAUTOMATIC
的通知吗?
看来,应用程序无需区分S3和CS模式(a.k.a AOAC,始终打开,始终连接)。虽然目前尚不清楚CS中是否允许网络活动。
到目前为止找不到任何正式的解决方案。在我的情况下,检测具有锁定/解锁原因的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;
}
}
以上是关于W8服务的已连接待机通知的主要内容,如果未能解决你的问题,请参考以下文章
对“xxx”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。 错误解决一例。(代码片段
VC++如何实时感知Windows系统进入和退出待机状态(附源码)