最近因为项目原因,需要控制操作系统的电源,也就是令操作系统何时关闭显示器、何时关闭硬盘、何时待机、何时休眠等。
这个可以使用API控制,我这里采用的是控制操作系统的电源方案,可以通过命令行中的powercfg去控制。控制操作系统的电源方案,还是调用API函数。
下面我就分别说一下windows xp和windows 7下电源操作的方法,这里以控制操作系统的电源方案为例。
我在项目中是先创建一个C的DLL,需引用PowrProf.lib静态库。
详细API操作请参见:
http://msdn.microsoft.com/en-us/library/aa372711(v=VS.85).aspx
1、Windows Xp电源方案控制
XP下的电源方案,如下图:
上图中的“家用”、“便携" 、”演示“、”一直开碰上“、”最少电源管理“、”最大电模式“是系统自带的五种方案,其索引值分别以0--4表示,其相应信息存储在注册表中。
创建电源方案,先使用"ReadPwrScheme"读取一个原有方案,然后在获取到的对象中设置自己的设置值,再使用 "WritePwrScheme”添加该方案,最后使用"SetActivePwrScheme“激活该电源方案,使我们自己填加的电源方案为正在使用的电源方案。
我正在使用的源码如下:
代码
1 /*电源操作 for windows xp*/
2 /*设置方案值与名称*/
3 extern "C" __declspec(dllexport) BOOLEAN WriteSchemeForXP(LPCWSTR lpszSchemeName,LPCWSTR lpszSchemeDescription,ULONG a,ULONG b,ULONG c,ULONG d,ULONG e,ULONG f,ULONG g,ULONG h)
4 {
5 UINT id=100;
6 //create
7 PPOWER_POLICY policy = new POWER_POLICY();
8 //read
9 ReadPwrScheme(0,policy);
10 //write
11 policy->user.IdleTimeoutAc = e; //待机
12 policy->user.IdleTimeoutDc = f;
13 policy->user.SpindownTimeoutAc = c; //关闭硬盘
14 policy->user.SpindownTimeoutDc = d;
15 policy->user.VideoTimeoutAc = a; //关闭显示器
16 policy->user.VideoTimeoutDc = b;
17 policy->mach.DozeS4TimeoutAc=g; //休眠
18 policy->mach.DozeS4TimeoutDc=h;
19
20 BOOLEAN result= WritePwrScheme(&id,lpszSchemeName,lpszSchemeDescription,policy);
21 SetActivePwrScheme(100,0,0);
22 return result;
23 }
24
25 /*删除电源方案*/
26 extern "C" __declspec(dllexport) BOOLEAN DelSchemeForXP()
27 {
28 //delete
29 BOOLEAN result = DeletePwrScheme(100);
30 //active
31 SetActivePwrScheme(0,0,0);
32 return result;
33 return 0;
34 }
2、Windows 7下的电源方案
Windows7与XP不同,它使用GUID值来唯一标识电源方案及电源方案下的各个详细信息,并且Windows7可以设置更加详细的电源控制,可以从powercfg
/query中查看。
原理与XP相同,源码如下:
代码
static const GUID GLOBAL_GUID =
{ 0x3b662acb, 0x0e27, 0x40cd, { 0x87, 0x1d, 0xd1, 0xb5, 0xc1, 0xac, 0x3e, 0xfe } };
static GUID *MAKE_GUID = new GUID(GLOBAL_GUID);
//电源方案"平衡"的GUID值 for WIN7
static const GUID POWER_SAVER_GUID = {
0x381b4222,0xf694,0x41f0,{0x96,0x85,0xff,0x5b,