connected standby
参考链接
https://docs.microsoft.com/en-us/windows-hardware/design/device-experiences/modern-standby
https://blogs.msdn.microsoft.com/winsdk/2014/12/02/how-to-get-notified-when-going-in-and-out-of-connected-standby-from-a-windows-service/
一 介绍
低功耗联网状态, win8 win8.1叫connected standby, win10 对win8的connected standby 进行了扩展, 并起了一个新名字,叫modern-standby
进入这种状态时,Windows Store Applications以及传统桌面程序会被暂停, session 0中的服务程序不会被暂停, 但是会受到一些限制(目前没有详细测试, 会受到哪些限制)
只有硬件跟系统都支持的时候, 这台机器才支持这种状态
二 查看是否支持这种状态
以win10为例, 使用命令powercfg /a之后, 如果有 so 低电量待机字样的说明当前机器支持这种状态

三 查看当前系统何时进入这种状态
还是以win10为例, 使用命令 powercfg /batteryreport, 成功执行后会在当前目录生成一份电池使用报告, 部分报告如下所示

四 程序感知系统进入跟离开这种状态
在第二个url中有详细的方法, 测试服务通知的时候发现有一些细节需要注意, 参见代码中的注释, 关键代码如下:
#include <PowrProf.h>
#pragma comment(lib,"PowrProf.lib")
#include <WinNT.h>
SERVICE_STATUS_HANDLE hStatus = NULL;
VOID WINAPI ServiceMain(DWORD dwNumServicesArgs, LPWSTR *lpServiceArgVectors)
{
//省略的代码 //为服务注册控制处理器
hStatus = RegisterServiceCtrlHandlerEx(L"aaa", Ctrlhandler, NULL);//服务名,指向controlhandlefunction指针
if (!hStatus)
{
return;
} //省略的代码 WriteLog("service start");
// 针对connected standby的特殊处理
HPOWERNOTIFY hNotify = NULL;
if (IsSupportConnectedStandby())
{
hNotify =RegisterPowerSettingNotification(hStatus, &GUID_MONITOR_POWER_ON, DEVICE_NOTIFY_SERVICE_HANDLE);
if (!hNotify)
WriteLog("register err!!!!");
else
WriteLog("register success");
} //省略的代码 // 服务主线程结束时, 要取消掉通知回调
if (hNotify)
UnregisterPowerSettingNotification(hNotify);
35 }
bool IsSupportConnectedStandby()//S0 low power idle
{
bool result = false;
do
{
SYSTEM_POWER_CAPABILITIES info = { };
NTSTATUS ret = CallNtPowerInformation(SystemPowerCapabilities, NULL, , &info, sizeof(info));
if (ret != )//STATUS_SUCCESS 用户层没有这个宏, 所以直接用数值进行比较
{
printf("get info error: %x\n", ret);
break;
}
if (info.AoAc == TRUE)
result = true;
} while (false); return result;
}
DWORD WINAPI Ctrlhandler(DWORD dwControl, DWORD dwEventType, LPVOID lpEventData, LPVOID lpContext)
{
switch (dwControl)
{
case SERVICE_CONTROL_STOP:
brun = false;
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
WriteLog("SERVICE_CONTROL_STOP");
break;
case SERVICE_CONTROL_SHUTDOWN:
brun = false;
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
WriteLog("SERVICE_CONTROL_SHUTDOWN");
break;
case SERVICE_CONTROL_PAUSE:
brun = false;
ServiceStatus.dwCurrentState = SERVICE_PAUSED;
WriteLog("SERVICE_CONTROL_SHUTDOWN");
break;
case SERVICE_CONTROL_CONTINUE:
brun = false;
ServiceStatus.dwCurrentState = SERVICE_RUNNING;
break;
case SERVICE_CONTROL_POWEREVENT:
switch (dwEventType)
{
case PBT_APMRESUMEAUTOMATIC:
{
WriteLog("PBT_APMRESUMEAUTOMATIC");
break;
}
case PBT_APMRESUMESUSPEND:
{
WriteLog("PBT_APMRESUMESUSPEND");
break;
}
case PBT_APMSUSPEND:
{
WriteLog("PBT_APMSUSPEND");
break;
}
case PBT_APMPOWERSTATUSCHANGE: // 交流变电池 或者电池变交流
{
WriteLog("PBT_APMPOWERSTATUSCHANGE");
break;
}
case PBT_POWERSETTINGCHANGE:
{
WriteLog("PBT_POWERSETTINGCHANGE");
PPOWERBROADCAST_SETTING setting = (PPOWERBROADCAST_SETTING)lpEventData;
if(setting->PowerSetting == GUID_MONITOR_POWER_ON)
{
std::string str("GUID_MONITOR_POWER_ON "); if(setting->DataLength == )
{
// MONITOR_POWER_OFF(data ==0)-->进入 connected standby状态
// MONITOR_POWER_ON(data ==1)-->进入 active状态
// MONITOR_POWER_OFF对应于设置里面睡眠进入的时间, 而不是根据字面意思对应设置里面的屏幕关闭时间, 这个要注意!!!
// 刚刚注册GUID_MONITOR_POWER_ON成功后会立刻收到一次该事件, 报告data ==1
DWORD data = *(DWORD*)(setting->Data);
str += std::to_string(data);
}
else
{
str += "len: ";
str += std::to_string(setting->DataLength);
}
WriteLog(str);
}
break;
} default:
break;
}
break;
case SERVICE_CONTROL_SESSIONCHANGE:
{
std::string str("SERVICE_CONTROL_SESSIONCHANGE: ");
str+= std::to_string(dwEventType); PWTSSESSION_NOTIFICATION Notification = (PWTSSESSION_NOTIFICATION)lpEventData;
str += " ";
str += std::to_string(Notification->dwSessionId);
WriteLog(str.c_str()); switch (dwEventType)
{
case WTS_CONSOLE_CONNECT:
break;
case WTS_CONSOLE_DISCONNECT:
break;
case WTS_SESSION_LOGON:
break;
case WTS_SESSION_LOGOFF:
break;
case WTS_SESSION_LOCK:
break;
case WTS_SESSION_UNLOCK:
break;
default:
;
}
}
break;
default:
break;
}
//向SCM报告“SERVICE_STOPPED”状态
SetServiceStatus(hStatus, &ServiceStatus);
return NO_ERROR;
}
connected standby的更多相关文章
- Mode Standby
Modern Standby 1.Connected Standby和 Connected Standby是Windows 8全新的电源管理系统,即当系统进入休眠状态时,应用程式虽处於暂停(suspe ...
- Windows操作系统
Microsoft Windows,是美国微软公司研发的一套操作系统,它问世于1985年,起初仅仅是Microsoft-DOS模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家 ...
- Win8 WinRT将替换Win32 API程序员何去何从?
win8 新引入了称为WinRT的核心API.支持使用C/C++..NET或JavaScript来开发Metro风格的应用.这些应用自动获得硬件加速和高级电源管理的功能.现有的Silverlight和 ...
- 盘点Windows 8.1中隐藏着的25个秘密功能
Windows 8.1正式版问世,带来了众多大家早已耳熟能详的“开始按钮”.“分屏显示”等功能.事实上,Windows 8.1贴心的设计细节有很多,多数细节隐藏于系统中某个不起眼的角落,科技网站PC ...
- Windows8 各种版本区别对比详解
微软的 Windows8 操作系统提供了4个不同的版本,分别是 Windows RT.Windows 8 标准版.Windows 8 Pro 专业版 以及 Windows 8 Enterprise 企 ...
- Windows 8.1 Preview的新功能和新API
http://msdn.microsoft.com/en-us/library/windows/apps/bg182410 App打包 新的App程序包将使App的提交更简单.资源包可以让你提供附加的 ...
- Windows Server 2016-Hyper-V 2016新增功能
本文解释了Windows Server 2016和Microsoft Hyper-V Server 2016上Hyper-V的新增功能和变更功能. 与Connected Standby兼容(新) 在使 ...
- Windows 操作系统
Microsoft Windows,是美国微软公司研发的一套操作系统,它问世于1985年,起初仅仅是Microsoft-DOS模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家 ...
- 9. Oracle DataGuard的介绍
一. Oracle DataGuard简介 Oracle DataGuard:简称DG.是由一个Primary Database(主库)和一个或者多个Standby Database(备库)组成.对O ...
随机推荐
- JavaScript获取元素尺寸和大小操作总结(转载)
一.获取元素的行内样式 var obj = document.getElementById("test"); alert(obj.height + "\n" + ...
- wordpress 暴力破解防范
一.author页面地址 author页面地址为 http://yoursite/?author=1 ID是自增的 请求这个地址会 301 到一个url,这个url里包含了作者的用户名.虽然不算漏洞, ...
- Pick the Right Shoes
shoe-->shoes pointed shoes ballet shoes high heel wedged boots strappy sandals绑带凉鞋 t-straps丁字鞋 co ...
- 42.输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S, 如果有多对数字的和等于S,输出两个数的乘积最小的。
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S, 如果有多对数字的和等于S,输出两个数的乘积最小的. 这道题有很多烟雾弹: 首先如果有多对,最前面的两个数就是乘积最小的, ...
- winform checkedlistbox 设置行颜色
重写OnDrawItem事件 public class ColorCodedCheckedListBox : CheckedListBox{ protected override void OnDra ...
- 20164322 韩玉婷-----Exp5 MSF基础应
Exp5 MSF基础应用 1.基础问题回答 exploit: 是指攻击者或渗透测试者利用一个系统.应用或服务中的安全漏洞所进行的攻击行为, 包括利用缓冲区溢出.Web应用程序漏洞攻击,以及利用配置错误 ...
- 2018.9.12 B树总结
1. B-Tree B-树是一种平衡的多路查找树,它在文件系统中很有用. 1.1 B-Tree 特性 关键字集合分布在整颗树中: 任何一个关键字出现且只出现在一个结点中: 搜索有可能在非叶子结点结束: ...
- linx6.7 update openssh to 7.7p1
升级之前需要注意几点: 1 必须要有自己的镜像,必须自己做好本地yum源(可以连接外网,能够有网络yum源也可以) 2 配置好基本的升级环境.在升级openssh时需要依赖openssl和zlib.一 ...
- 序列化、time、random、hashlib、sys模块
•很多常用和内置模块,我们只需要掌握他们的用法而暂时不用考虑内部是如何实现的,这些模块大大提升了开发效率 ! 1.json模块与pickle模块 •json 如果你有这样的困扰,当希望把一种数据存到硬 ...
- dic and set
一.dic 1.格式:key:value 2.key值必须不可变(可hash) 3.key不可重复(唯一性) 4.优点:查找.插入速度快 5.缺点:空间消耗大 6.实质是以空间换速度 7.常用参数 1 ...