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_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中是否允许网络活动。

另一答案

到目前为止找不到任何正式的解决方案。在我的情况下,检测具有锁定/解锁原因的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系统进入和退出待机状态(附源码)

如何通知 CDialog 对象有关来自另一个线程的已完成任务?

获取可以发送通知的已安装 Windows 应用程序列表

在每个IP地址的端口80上打印到服务器的已建立和正在侦听的连接数