论文部分内容阅读
摘要:利用Intel Mobile PlatForm SDK中关于电源管理的开发接口,提出了电源管理的技术方案,解决了教师上课过程中电脑黑屏和屏幕保护程序自动运行的问题,并为相关工程技术人员给出了一个实例作参考。
关键词:黑屏;屏幕保护;电源管理;开发接口
0引言
在多媒体为主的课堂演示教学过程中,经常会碰到这样的问题,老师正在专心讲课,突然屏幕出现黑屏或者进入屏幕保护状态,导致上课不得不中断一段时间。如果是简单的黑屏,需要通过键盘激活屏幕;如果进入屏保状态,还需要通过输入屏幕保护的密码才能回到正常状态。频繁的中断影响了课堂教学效果。本文主要通过软件的方式来实现多媒体教学的电源管理,从而解决老师在多媒体教学过程中遇到的技术问题,让老师从计算机的烦扰中解脱出来,专心专业课程的教学。我们所使用的开发平台为:c/C++编译器;Windows XP以上操作系统;Intel@Mobile platform SDK;P4以上Intel处理器。
1高级电源管理技术原理概述
1.1使用高级电源管理原因分析
以Windows XP为例,用户可以通过控制面板来使用电源管理组件,通过系统设置,设定显示器进入休眠状态的时间,硬盘关闭时间等等,但并不是每一个用户都精通这些设置。教师讲课的公共教学平台,如果长时间不使用屏保,计算机的使用寿命会大大缩短,—个典型的例子就是用于工业控制的计算机的显示器只有3年寿命,显示器长期处于—个画面状态,显像管(CRT)全快速老化,画面变模糊而无法继续使用,根本无法达到教学用机淘汰时间4~6年的要求。此外,笔记本电脑使用电池工作的时候,Windows系统会自动进入节能状态,当计算机空闲的时候会快速进入休眠状态,屏幕会自动关闭,如果强行改变系统设置,将对笔记本造成很大的伤害。以上这—些问题都需要有一种电源管理技术来解决。以下我们将介绍Intel高级电源管理技术相关开发细节。
1.2高级电源管理开发接口分析
Intel移动开发平台支持高级电源管理软件的开发,同时支持c,c++,.NET和Java等流行语言。不失一般性,本文以C/C++为例进行分析。
解决系统的黑屏问题,首先要获得系统黑屏的等待时间;同样,要解决屏幕保护程序自动运行的问题,也要获得屏保程序的等待时间。通过下面的函数可以获得屏幕保护延迟时间,并停止屏幕保护程序的运行:
#include"winnt.h”
UINT sSaveScreenTime;
SystemParameterslnfo(SPI_GETSCREENSAVETIMEOUT,0,&
sSaveScreenTime,0);//获得屏幕保护延迟时间SystemParameterslnfo(SPl_GE rSCREENSAVETIMEOUT,0,
NULL,0);//关闭屏幕保护
可以通过下面函数来恢复系统屏幕保护时间参数:SystemParameterslnfo(SPI_GETSCREENSAVETIMEOUT,
sSaveScreenTime,NULL,O):
下面讨论屏幕自动关闭的解决方法。第一种方法是利用函数SetThreadExecutionSate0。通过该函数的运行,可以让操作系统捕获系统的运行状态,从而强制系统阻止WM_POWERBROADCAST消息在系统间传递。格式如下:
EXECUTION_STATE PreventStat;
UINT sSaveDisplayTimeOut;
PreventStat=SetThreadExcutionState
(ES DISPLAY REQUIREDIES COUNTINUOUS);
//PreventStat变量保存进程工作状态参数
//Es DISPLAY REQUIRED参数指示系统需要显示器正常工作;
//ES_COUNTINUOUS参数指示系统要保持现有状态,直到状态
发生改变
SystemParameterslnfo(SPI GETSCREENSAVETIMEOUT,0。
&sSaveDisplayTimeOut,O):
//保存系统原来电源参数
SystemParameterslnfo(SPl_GETSCREENSAVETIMEOUT,0,
NULL,0);//关闭屏幕保护
恢复系统原来状态方法:
PreventStat=SetThreadExcutionState (PreventStat);
SystemParameterslnfo(SPI GETSCREENSAVETIMEOUT.
sSaveDisplayTimeOut,NULL,O):
第二种方法是允许WM_POWERBROADCAST消息在系统间传递,利用软件来响应对应的消息,并采取必要的方法使系统返回工作状态。方法如下:
#include“powerprof.h”
GLOBAL_POWER_POLICY Gpp;//定义全局电源策略变量
POWER_POLICY PP;//定义局部策略变量
ULONG SaveVideoAC,SaveVideoDC;
//定义交流和直流电源使用状态变量
UINT id.sSave;
GetActivePwrScheme(&id)://捕获当前电源策略标识
GetCurrentPowerPoUcies(&Gpp,&Pp):
//捕获当前电源策略存放在变量Gpp和PD中
SaveVideoAC=Pp.user.VideOTimeOutAC:
//保存当前交流电使用状态
SaveVideODC=Pp.user.VideOTimeoutDC:
//保存当前直流电使用状态
Pp.user.VideOTimeoutAC=0:
Pp.user.VideOTimeOutDC=0:
SetCun'enlPowerPolicles(id,Gpp.&Pp):
//清除交流电和直流电为0的目的是使系统无法关闭显示器
SystemParametersInfo(SPl GETSCREENSAVETIMEOUT,0.
&sSave。O)://保存当前显示器电源状态
SystemParametersInf0(SPI GETSCREENSAVETlMEOUT,0,
NULL,0)://关闭屏幕保护
恢复系统工作状态方法如下:
PD.user.Vjde0TimeoutAC=SaveVIdeoAC: //恢复交流电状态
PD.user.VideoTimeoutDC=SaveVIdeoDC; //恢复直流电状态
SetCurrentPowerPolicies(id,Gpp,&Pp): //恢复当前电源策略 SvstemParametersInfO(SPl GETSCREENSAVETIMEOUT,
sSave,NULL,0)://恢复屏幕保护原来的设置
1.3定制电源解决方案
以上方法可以解决上课过程中的黑屏和屏幕保护程序自动运行问题。但是这种方法不具备灵活性,因为无论是屏幕保护时间参数或者是电源管理策略都预先在程序中设置,无法在现场教学中随意控制。本文的做法是将各种控制的策略存放在数据库中,让电源管理策略菜单化,上课时教师只需在菜单中选择电源管理模式。
首先定义一个回调函数和一个数据结构:
#incIude“Dowrprof.h”
BOOLEAN CALLBACK PS PowerCa¨Back(UINT,DWORD,
LPTSTR。DWORD,LPTSTR,PPOWER POLICY,LPAIRAM);
//定义回调函数
typedef strucl pwrschmIist{//定义电源策略管理数据结构
UINT P0llD://电源策略标识符
DWORD PoINameLen://电源策略名字长度
LPTSTR
P0lName://电源策略名称
DWORD PoIDescLen://电源策略描述符长度
LPTSTR
PolDesc://电源策略描述符
PPOWER PO LICY PolElems://系统电源策略结构
strucl pwrschmIistnxtSchm:
//电源策略管理链表指针,指向下一个电源策略管理数据结构
}PowerSchemeList,pPowerSchemeList:
DPowerSchemeList pAlIPOIicies=NULL,pLastScheme:
//定义两个结构变量,用来表示电源策略链和最后一个策略
BOOLEAN CALLBACK PS—PowerCallBack(UINT schmID.
DWORD dwNameLen.LPTSTR schmName,DWORD
dwDescLen。LPTSTR schmDesc,PPOWER.-POLlCY ppwrplcy。
LPARAM IParaml//实现回调函数
{pPowerschemeList curnode=(pPowerSchemeList,)calIoc(1,
sizeof(PowerschemeList)):
cumode->PoIID=schmID://保存策略标识符
curnode->PoIName=(LPTSTR)calIoc(1,dwNameLen+1):
//计算真正的策略字符串名字
memcpy(cumode->PoIName,schmName,dwNameLen):
//保存电源策略名称
cumOde->POINameLen=dwNameLen:
//保存电源策略名称长度
cumode->PolDesc=(LPTSTR)caIIoc(1,dwDescLen+1):
//计算电源策略描述符
memcpy(curnode一>PoIDesc,schmDesc,dwDescLen):
//保存电源策略描述符
curnOde->POIDescLen=dwDescLen:
//保存电源策略描述符长度
cumode->PoIEIems=(PPOVVER_POLICY)ca¨oc(1,
sizeof(POWER—POLICY)):
memcpy(cumode->PolEIems,ppwrplcy,sizeof
(POwER—POLlCY)):
//保存系统电源策略
If(NULL==pA¨Policies){
DAllPolicies=curnOde:
}
eIse{
DLastScheme->nxtSchm=cumode:
//完成电源管理策略链表的连接
}
pLasfScheme=cumode;//计算最后的节点
retum(TRUE):
}
以上代码中,数据结构变量PowerschcreeList保存了电源管_理策略所需要的所有数据,回调函数Ps PoWerCallBack用于保存电源策略,变量pAllPolicies用于遍历所有管理策略的节点。
要完成链表的创建,使用以下代码:
BOOLEAN RsIl:
RsIt=EnumPwrScheme(&PS—PowerCa¨Back,0);
//枚举所有电源策略,并保存到指定链表pAllPolicies队列中
编程人员可以通过对话框来完成对电源管理策略的设置和选择。其中关键的交互数据包括策略管理标识符PolID和P0lElcms,第—个参数用来存储顺序号,第二个参数存储真正的系统电源策略数据结构,然后通过以下代码完成策略的设置:
GLOBALPOWER—POLlCY CurrentGP:
POWER—POLICY SavCurrentPP:
ULONG savVidAC。savVidDC:
UlNT savid,ssav:
GetActivePWrScheme(&sayId):
GetCurrentPowerPolicies(&CurrentGP,&SavCurrentPP):
SecCurrentPowerPoIicies(SavedPolID.NULL,&SavedPo眶Iems):
SystemParameterslnfo(SPI—_GETSCREENSAVETIMEOUT,0,
&ssav,O):
SystemPaFametersInf0(SPI SETSCREENSAVETlMEOUT,0,
NULL,0):
恢复系统:
SetCurrentPowerPolicies(savid,&CurrentGP,&SavCurrentPP)=
SystemParametersInf0(SPI—SETSCREENSAVETIMEOUT,
ssav,NULL,U);
2结束语
本文提供的方法,基本上解决了现代多媒体教学中常见的黑屏和屏幕保护等电源方面的问题。但是计算机电源管理技术的真正应用是多方面的,灵活使用计算机电源管理技术,既可以延长计算机使用寿命,又可以保证教学工作的顺利进行。希望本文能为广大教师和机器管理人员提供一个技术参考。
(注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。)
关键词:黑屏;屏幕保护;电源管理;开发接口
0引言
在多媒体为主的课堂演示教学过程中,经常会碰到这样的问题,老师正在专心讲课,突然屏幕出现黑屏或者进入屏幕保护状态,导致上课不得不中断一段时间。如果是简单的黑屏,需要通过键盘激活屏幕;如果进入屏保状态,还需要通过输入屏幕保护的密码才能回到正常状态。频繁的中断影响了课堂教学效果。本文主要通过软件的方式来实现多媒体教学的电源管理,从而解决老师在多媒体教学过程中遇到的技术问题,让老师从计算机的烦扰中解脱出来,专心专业课程的教学。我们所使用的开发平台为:c/C++编译器;Windows XP以上操作系统;Intel@Mobile platform SDK;P4以上Intel处理器。
1高级电源管理技术原理概述
1.1使用高级电源管理原因分析
以Windows XP为例,用户可以通过控制面板来使用电源管理组件,通过系统设置,设定显示器进入休眠状态的时间,硬盘关闭时间等等,但并不是每一个用户都精通这些设置。教师讲课的公共教学平台,如果长时间不使用屏保,计算机的使用寿命会大大缩短,—个典型的例子就是用于工业控制的计算机的显示器只有3年寿命,显示器长期处于—个画面状态,显像管(CRT)全快速老化,画面变模糊而无法继续使用,根本无法达到教学用机淘汰时间4~6年的要求。此外,笔记本电脑使用电池工作的时候,Windows系统会自动进入节能状态,当计算机空闲的时候会快速进入休眠状态,屏幕会自动关闭,如果强行改变系统设置,将对笔记本造成很大的伤害。以上这—些问题都需要有一种电源管理技术来解决。以下我们将介绍Intel高级电源管理技术相关开发细节。
1.2高级电源管理开发接口分析
Intel移动开发平台支持高级电源管理软件的开发,同时支持c,c++,.NET和Java等流行语言。不失一般性,本文以C/C++为例进行分析。
解决系统的黑屏问题,首先要获得系统黑屏的等待时间;同样,要解决屏幕保护程序自动运行的问题,也要获得屏保程序的等待时间。通过下面的函数可以获得屏幕保护延迟时间,并停止屏幕保护程序的运行:
#include"winnt.h”
UINT sSaveScreenTime;
SystemParameterslnfo(SPI_GETSCREENSAVETIMEOUT,0,&
sSaveScreenTime,0);//获得屏幕保护延迟时间SystemParameterslnfo(SPl_GE rSCREENSAVETIMEOUT,0,
NULL,0);//关闭屏幕保护
可以通过下面函数来恢复系统屏幕保护时间参数:SystemParameterslnfo(SPI_GETSCREENSAVETIMEOUT,
sSaveScreenTime,NULL,O):
下面讨论屏幕自动关闭的解决方法。第一种方法是利用函数SetThreadExecutionSate0。通过该函数的运行,可以让操作系统捕获系统的运行状态,从而强制系统阻止WM_POWERBROADCAST消息在系统间传递。格式如下:
EXECUTION_STATE PreventStat;
UINT sSaveDisplayTimeOut;
PreventStat=SetThreadExcutionState
(ES DISPLAY REQUIREDIES COUNTINUOUS);
//PreventStat变量保存进程工作状态参数
//Es DISPLAY REQUIRED参数指示系统需要显示器正常工作;
//ES_COUNTINUOUS参数指示系统要保持现有状态,直到状态
发生改变
SystemParameterslnfo(SPI GETSCREENSAVETIMEOUT,0。
&sSaveDisplayTimeOut,O):
//保存系统原来电源参数
SystemParameterslnfo(SPl_GETSCREENSAVETIMEOUT,0,
NULL,0);//关闭屏幕保护
恢复系统原来状态方法:
PreventStat=SetThreadExcutionState (PreventStat);
SystemParameterslnfo(SPI GETSCREENSAVETIMEOUT.
sSaveDisplayTimeOut,NULL,O):
第二种方法是允许WM_POWERBROADCAST消息在系统间传递,利用软件来响应对应的消息,并采取必要的方法使系统返回工作状态。方法如下:
#include“powerprof.h”
GLOBAL_POWER_POLICY Gpp;//定义全局电源策略变量
POWER_POLICY PP;//定义局部策略变量
ULONG SaveVideoAC,SaveVideoDC;
//定义交流和直流电源使用状态变量
UINT id.sSave;
GetActivePwrScheme(&id)://捕获当前电源策略标识
GetCurrentPowerPoUcies(&Gpp,&Pp):
//捕获当前电源策略存放在变量Gpp和PD中
SaveVideoAC=Pp.user.VideOTimeOutAC:
//保存当前交流电使用状态
SaveVideODC=Pp.user.VideOTimeoutDC:
//保存当前直流电使用状态
Pp.user.VideOTimeoutAC=0:
Pp.user.VideOTimeOutDC=0:
SetCun'enlPowerPolicles(id,Gpp.&Pp):
//清除交流电和直流电为0的目的是使系统无法关闭显示器
SystemParametersInfo(SPl GETSCREENSAVETIMEOUT,0.
&sSave。O)://保存当前显示器电源状态
SystemParametersInf0(SPI GETSCREENSAVETlMEOUT,0,
NULL,0)://关闭屏幕保护
恢复系统工作状态方法如下:
PD.user.Vjde0TimeoutAC=SaveVIdeoAC: //恢复交流电状态
PD.user.VideoTimeoutDC=SaveVIdeoDC; //恢复直流电状态
SetCurrentPowerPolicies(id,Gpp,&Pp): //恢复当前电源策略 SvstemParametersInfO(SPl GETSCREENSAVETIMEOUT,
sSave,NULL,0)://恢复屏幕保护原来的设置
1.3定制电源解决方案
以上方法可以解决上课过程中的黑屏和屏幕保护程序自动运行问题。但是这种方法不具备灵活性,因为无论是屏幕保护时间参数或者是电源管理策略都预先在程序中设置,无法在现场教学中随意控制。本文的做法是将各种控制的策略存放在数据库中,让电源管理策略菜单化,上课时教师只需在菜单中选择电源管理模式。
首先定义一个回调函数和一个数据结构:
#incIude“Dowrprof.h”
BOOLEAN CALLBACK PS PowerCa¨Back(UINT,DWORD,
LPTSTR。DWORD,LPTSTR,PPOWER POLICY,LPAIRAM);
//定义回调函数
typedef strucl pwrschmIist{//定义电源策略管理数据结构
UINT P0llD://电源策略标识符
DWORD PoINameLen://电源策略名字长度
LPTSTR
P0lName://电源策略名称
DWORD PoIDescLen://电源策略描述符长度
LPTSTR
PolDesc://电源策略描述符
PPOWER PO LICY PolElems://系统电源策略结构
strucl pwrschmIistnxtSchm:
//电源策略管理链表指针,指向下一个电源策略管理数据结构
}PowerSchemeList,pPowerSchemeList:
DPowerSchemeList pAlIPOIicies=NULL,pLastScheme:
//定义两个结构变量,用来表示电源策略链和最后一个策略
BOOLEAN CALLBACK PS—PowerCallBack(UINT schmID.
DWORD dwNameLen.LPTSTR schmName,DWORD
dwDescLen。LPTSTR schmDesc,PPOWER.-POLlCY ppwrplcy。
LPARAM IParaml//实现回调函数
{pPowerschemeList curnode=(pPowerSchemeList,)calIoc(1,
sizeof(PowerschemeList)):
cumode->PoIID=schmID://保存策略标识符
curnode->PoIName=(LPTSTR)calIoc(1,dwNameLen+1):
//计算真正的策略字符串名字
memcpy(cumode->PoIName,schmName,dwNameLen):
//保存电源策略名称
cumOde->POINameLen=dwNameLen:
//保存电源策略名称长度
cumode->PolDesc=(LPTSTR)caIIoc(1,dwDescLen+1):
//计算电源策略描述符
memcpy(curnode一>PoIDesc,schmDesc,dwDescLen):
//保存电源策略描述符
curnOde->POIDescLen=dwDescLen:
//保存电源策略描述符长度
cumode->PoIEIems=(PPOVVER_POLICY)ca¨oc(1,
sizeof(POWER—POLICY)):
memcpy(cumode->PolEIems,ppwrplcy,sizeof
(POwER—POLlCY)):
//保存系统电源策略
If(NULL==pA¨Policies){
DAllPolicies=curnOde:
}
eIse{
DLastScheme->nxtSchm=cumode:
//完成电源管理策略链表的连接
}
pLasfScheme=cumode;//计算最后的节点
retum(TRUE):
}
以上代码中,数据结构变量PowerschcreeList保存了电源管_理策略所需要的所有数据,回调函数Ps PoWerCallBack用于保存电源策略,变量pAllPolicies用于遍历所有管理策略的节点。
要完成链表的创建,使用以下代码:
BOOLEAN RsIl:
RsIt=EnumPwrScheme(&PS—PowerCa¨Back,0);
//枚举所有电源策略,并保存到指定链表pAllPolicies队列中
编程人员可以通过对话框来完成对电源管理策略的设置和选择。其中关键的交互数据包括策略管理标识符PolID和P0lElcms,第—个参数用来存储顺序号,第二个参数存储真正的系统电源策略数据结构,然后通过以下代码完成策略的设置:
GLOBALPOWER—POLlCY CurrentGP:
POWER—POLICY SavCurrentPP:
ULONG savVidAC。savVidDC:
UlNT savid,ssav:
GetActivePWrScheme(&sayId):
GetCurrentPowerPolicies(&CurrentGP,&SavCurrentPP):
SecCurrentPowerPoIicies(SavedPolID.NULL,&SavedPo眶Iems):
SystemParameterslnfo(SPI—_GETSCREENSAVETIMEOUT,0,
&ssav,O):
SystemPaFametersInf0(SPI SETSCREENSAVETlMEOUT,0,
NULL,0):
恢复系统:
SetCurrentPowerPolicies(savid,&CurrentGP,&SavCurrentPP)=
SystemParametersInf0(SPI—SETSCREENSAVETIMEOUT,
ssav,NULL,U);
2结束语
本文提供的方法,基本上解决了现代多媒体教学中常见的黑屏和屏幕保护等电源方面的问题。但是计算机电源管理技术的真正应用是多方面的,灵活使用计算机电源管理技术,既可以延长计算机使用寿命,又可以保证教学工作的顺利进行。希望本文能为广大教师和机器管理人员提供一个技术参考。
(注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。)