设置系统的电源计划

2019-07-13 21:20发布

win7 修改当前电源计划: 1、首先通过 PowerGetActiveScheme 函数获取当前我们使用电源计划的 GUID。 2、通过 PowerWriteACValuesIndex 函数 和 PowerWriteDCValuesIndex 修改当前电源计划中的各种数值。 DWORD WINAPI PowerWriteDCValueIndex( _In_opt_  HKEY RootPowerKey, _In_      const GUID *SchemeGuid, _In_opt_  const GUID *SubGroupOfPowerSettingsGuid, _In_opt_  const GUID *PowerSettingGuid, _In_      DWORD DcValueIndex ); RootPowerKey:保留,必须为NULL。 SchemeGuid:    电源计划的GUID。 SubGroupOfPowerSettiingsGuid:电源计划子选项。例如:显示器、硬盘、睡眠等
具体应该是图片中的选项。具体参数在 MSDN 中已经说明。 PowerSettingGuid: 这个值在 MSDN 中没有具体说明,该值在 WinNT.h 中定义的。是对第三个参数具体说明。 DCValueIndex:是具体的具体数值。例如显示中多少分钟后关闭显示器,这里是以秒为单位。如果是0,这表示从不。 3、设置完成之后,要激活计划。 PowerSetActiveScheme. GUID *id; // 获取当前活动的电源计划 PowerGetActiveScheme(NULL, &id); // 设置显示器从不关闭 PowerWriteACValueIndex(NULL, id, &GUID_VIDEO_SUBGROUP, &GUID_VIDEO_POWERDOWN_TIMEOUT, 0); PowerWriteDCValueIndex(NULL, id, &GUID_VIDEO_SUBGROUP, &GUID_VIDEO_POWERDOWN_TIMEOUT, 0); // 使设置生效 PowerSetActiveScheme(NULL, id);


我们也可以设置自定义的电源计划。
static const GUID GLOBAL_GUID = { 0x3b662acb, 0x0e27, 0x40cd, { 0x87, 0x1d, 0xd1, 0xb5, 0xc1, 0xac, 0x3e, 0xfe } }; static GUID *MY_GUID = new GUID(GLOBAL_GUID); //win7 的电源方案"平衡"的GUID值 static const GUID POWER_SAVER_GUID = { 0x381b4222,0xf694,0x41f0,{0x96,0x85,0xff,0x5b,0xb2,0x60,0xdf,0x2e} }; // 拷贝一个存在的电源计划给自定义的计划 PowerDuplicateScheme(NULL, &POWER_SAVER_GUID, &MY_GUID); // 修改自定义计划的名字和描述。 LPCWSTR powername = _T("我的计划"); LPCWSTR powerdescription = _T("我自己定义的计划"); PowerWriteFriendlyName(NULL, MY_GUID, NULL, NULL, (UCHAR*)powername, strlen((char*)powername)); PowerWriteDescription(NULL, MY_GUID, NULL, NULL, (UCHAR*)powerdescription, strlen((char*)powerdescription)); // 激活自己的计划 PowerSetActiveScheme(NULL, MY_GUID);
// 激活计划PowerSetActiveScheme(NULL, id) 删除电源计划使用 PowerDeleteScheme 函数。 XP下的电源方案,如下图:   上图中的“家用”、“便携" 、”演示“、”一直开着“、”最少电源管理“、”最大电模式“是系统自带的五种方案,其索引值分别以0--4表示,其相应信息存储在注册表中。 创建电源方案,先使用"ReadPwrScheme"读取一个原有方案,然后在获取到的对象中设置自己的设置值,再使用 "WritePwrScheme”添加该方案,最后使用"SetActivePwrScheme“激活该电源方案,使我们自己填加的电源方案为正在使用的电源方案。 UINT id=100; //create PPOWER_POLICY policy = new POWER_POLICY(); //read ReadPwrScheme(0,policy); //write policy->user.IdleTimeoutAc = 0; //待机 policy->user.IdleTimeoutDc = f; policy->user.SpindownTimeoutAc = 0; //关闭硬盘 policy->user.SpindownTimeoutDc = ; policy->user.VideoTimeoutAc = 0; //关闭显示器 policy->user.VideoTimeoutDc = 0; policy->mach.DozeS4TimeoutAc=0; //休眠 policy->mach.DozeS4TimeoutDc=0; LPCWSTR SchemeName; LPCTSTR SchemeDescription; BOOLEAN result= WritePwrScheme(&id,SchemeName,SchemeDescription,policy); SetActivePwrScheme(100,0,0);