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);