摘要:利用Intel Mobile PlatForm SDK中關(guān)于電源管理的開(kāi)發(fā)接口,提出了電源管理的技術(shù)方案,解決了教師上課過(guò)程中電腦黑屏和屏幕保護(hù)程序自動(dòng)運(yùn)行的問(wèn)題,并為相關(guān)工程技術(shù)人員給出了一個(gè)實(shí)例作參考。
關(guān)鍵詞:黑屏;屏幕保護(hù);電源管理;開(kāi)發(fā)接口
0引言
在多媒體為主的課堂演示教學(xué)過(guò)程中,經(jīng)常會(huì)碰到這樣的問(wèn)題,老師正在專心講課,突然屏幕出現(xiàn)黑屏或者進(jìn)入屏幕保護(hù)狀態(tài),導(dǎo)致上課不得不中斷一段時(shí)間。如果是簡(jiǎn)單的黑屏,需要通過(guò)鍵盤(pán)激活屏幕;如果進(jìn)入屏保狀態(tài),還需要通過(guò)輸入屏幕保護(hù)的密碼才能回到正常狀態(tài)。頻繁的中斷影響了課堂教學(xué)效果。本文主要通過(guò)軟件的方式來(lái)實(shí)現(xiàn)多媒體教學(xué)的電源管理,從而解決老師在多媒體教學(xué)過(guò)程中遇到的技術(shù)問(wèn)題,讓老師從計(jì)算機(jī)的煩擾中解脫出來(lái),專心專業(yè)課程的教學(xué)。我們所使用的開(kāi)發(fā)平臺(tái)為:c/C++編譯器;Windows XP以上操作系統(tǒng);Intel@Mobile platform SDK;P4以上Intel處理器。
1高級(jí)電源管理技術(shù)原理概述
1.1使用高級(jí)電源管理原因分析
以Windows XP為例,用戶可以通過(guò)控制面板來(lái)使用電源管理組件,通過(guò)系統(tǒng)設(shè)置,設(shè)定顯示器進(jìn)入休眠狀態(tài)的時(shí)間,硬盤(pán)關(guān)閉時(shí)間等等,但并不是每一個(gè)用戶都精通這些設(shè)置。教師講課的公共教學(xué)平臺(tái),如果長(zhǎng)時(shí)間不使用屏保,計(jì)算機(jī)的使用壽命會(huì)大大縮短,—個(gè)典型的例子就是用于工業(yè)控制的計(jì)算機(jī)的顯示器只有3年壽命,顯示器長(zhǎng)期處于—個(gè)畫(huà)面狀態(tài),顯像管(CRT)全快速老化,畫(huà)面變模糊而無(wú)法繼續(xù)使用,根本無(wú)法達(dá)到教學(xué)用機(jī)淘汰時(shí)間4~6年的要求。此外,筆記本電腦使用電池工作的時(shí)候,Windows系統(tǒng)會(huì)自動(dòng)進(jìn)入節(jié)能狀態(tài),當(dāng)計(jì)算機(jī)空閑的時(shí)候會(huì)快速進(jìn)入休眠狀態(tài),屏幕會(huì)自動(dòng)關(guān)閉,如果強(qiáng)行改變系統(tǒng)設(shè)置,將對(duì)筆記本造成很大的傷害。以上這—些問(wèn)題都需要有一種電源管理技術(shù)來(lái)解決。以下我們將介紹Intel高級(jí)電源管理技術(shù)相關(guān)開(kāi)發(fā)細(xì)節(jié)。
1.2高級(jí)電源管理開(kāi)發(fā)接口分析
Intel移動(dòng)開(kāi)發(fā)平臺(tái)支持高級(jí)電源管理軟件的開(kāi)發(fā),同時(shí)支持c,c++,.NET和Java等流行語(yǔ)言。不失一般性,本文以C/C++為例進(jìn)行分析。
解決系統(tǒng)的黑屏問(wèn)題,首先要獲得系統(tǒng)黑屏的等待時(shí)間;同樣,要解決屏幕保護(hù)程序自動(dòng)運(yùn)行的問(wèn)題,也要獲得屏保程序的等待時(shí)間。通過(guò)下面的函數(shù)可以獲得屏幕保護(hù)延遲時(shí)間,并停止屏幕保護(hù)程序的運(yùn)行:
#include\"winnt.h”
UINT sSaveScreenTime;
SystemParameterslnfo(SPI_GETSCREENSAVETIMEOUT,0,
sSaveScreenTime,0);//獲得屏幕保護(hù)延遲時(shí)間SystemParameterslnfo(SPl_GE rSCREENSAVETIMEOUT,0,
NULL,0);//關(guān)閉屏幕保護(hù)
可以通過(guò)下面函數(shù)來(lái)恢復(fù)系統(tǒng)屏幕保護(hù)時(shí)間參數(shù):SystemParameterslnfo(SPI_GETSCREENSAVETIMEOUT,
sSaveScreenTime,NULL,O):
下面討論屏幕自動(dòng)關(guān)閉的解決方法。第一種方法是利用函數(shù)SetThreadExecutionSate0。通過(guò)該函數(shù)的運(yùn)行,可以讓操作系統(tǒng)捕獲系統(tǒng)的運(yùn)行狀態(tài),從而強(qiáng)制系統(tǒng)阻止WM_POWERBROADCAST消息在系統(tǒng)間傳遞。格式如下:
EXECUTION_STATE PreventStat;
UINT sSaveDisplayTimeOut;
PreventStat=SetThreadExcutionState
(ES DISPLAY REQUIREDIES COUNTINUOUS);
//PreventStat變量保存進(jìn)程工作狀態(tài)參數(shù)
//Es DISPLAY REQUIRED參數(shù)指示系統(tǒng)需要顯示器正常工作;
//ES_COUNTINUOUS參數(shù)指示系統(tǒng)要保持現(xiàn)有狀態(tài),直到狀態(tài)
發(fā)生改變
SystemParameterslnfo(SPI GETSCREENSAVETIMEOUT,0。
sSaveDisplayTimeOut,O):
//保存系統(tǒng)原來(lái)電源參數(shù)
SystemParameterslnfo(SPl_GETSCREENSAVETIMEOUT,0,
NULL,0);//關(guān)閉屏幕保護(hù)
恢復(fù)系統(tǒng)原來(lái)狀態(tài)方法:
PreventStat=SetThreadExcutionState (PreventStat);
SystemParameterslnfo(SPI GETSCREENSAVETIMEOUT.
sSaveDisplayTimeOut,NULL,O):
第二種方法是允許WM_POWERBROADCAST消息在系統(tǒng)間傳遞,利用軟件來(lái)響應(yīng)對(duì)應(yīng)的消息,并采取必要的方法使系統(tǒng)返回工作狀態(tài)。方法如下:
#include“powerprof.h”
GLOBAL_POWER_POLICY Gpp;//定義全局電源策略變量
POWER_POLICY PP;//定義局部策略變量
ULONG SaveVideoAC,SaveVideoDC;
//定義交流和直流電源使用狀態(tài)變量
UINT id.sSave;
GetActivePwrScheme(id)://捕獲當(dāng)前電源策略標(biāo)識(shí)
GetCurrentPowerPoUcies(Gpp,Pp):
//捕獲當(dāng)前電源策略存放在變量Gpp和PD中
SaveVideoAC=Pp.user.VideOTimeOutAC:
//保存當(dāng)前交流電使用狀態(tài)
SaveVideODC=Pp.user.VideOTimeoutDC:
//保存當(dāng)前直流電使用狀態(tài)
Pp.user.VideOTimeoutAC=0:
Pp.user.VideOTimeOutDC=0:
SetCun'enlPowerPolicles(id,Gpp.Pp):
//清除交流電和直流電為0的目的是使系統(tǒng)無(wú)法關(guān)閉顯示器
SystemParametersInfo(SPl GETSCREENSAVETIMEOUT,0.
sSave。O)://保存當(dāng)前顯示器電源狀態(tài)
SystemParametersInf0(SPI GETSCREENSAVETlMEOUT,0,
NULL,0)://關(guān)閉屏幕保護(hù)
恢復(fù)系統(tǒng)工作狀態(tài)方法如下:
PD.user.Vjde0TimeoutAC=SaveVIdeoAC: //恢復(fù)交流電狀態(tài)
PD.user.VideoTimeoutDC=SaveVIdeoDC; //恢復(fù)直流電狀態(tài)
SetCurrentPowerPolicies(id,Gpp,Pp): //恢復(fù)當(dāng)前電源策略
SvstemParametersInfO(SPl GETSCREENSAVETIMEOUT,
sSave,NULL,0)://恢復(fù)屏幕保護(hù)原來(lái)的設(shè)置
1.3定制電源解決方案
以上方法可以解決上課過(guò)程中的黑屏和屏幕保護(hù)程序自動(dòng)運(yùn)行問(wèn)題。但是這種方法不具備靈活性,因?yàn)闊o(wú)論是屏幕保護(hù)時(shí)間參數(shù)或者是電源管理策略都預(yù)先在程序中設(shè)置,無(wú)法在現(xiàn)場(chǎng)教學(xué)中隨意控制。本文的做法是將各種控制的策略存放在數(shù)據(jù)庫(kù)中,讓電源管理策略菜單化,上課時(shí)教師只需在菜單中選擇電源管理模式。
首先定義一個(gè)回調(diào)函數(shù)和一個(gè)數(shù)據(jù)結(jié)構(gòu):
#incIude“Dowrprof.h”
BOOLEAN CALLBACK PS PowerCa¨Back(UINT,DWORD,
LPTSTR。DWORD,LPTSTR,PPOWER POLICY,LPAIRAM);
//定義回調(diào)函數(shù)
typedef strucl pwrschmIist{//定義電源策略管理數(shù)據(jù)結(jié)構(gòu)
UINT P0llD://電源策略標(biāo)識(shí)符
DWORD PoINameLen://電源策略名字長(zhǎng)度
LPTSTR
P0lName://電源策略名稱
DWORD PoIDescLen://電源策略描述符長(zhǎng)度
LPTSTR
PolDesc://電源策略描述符
PPOWER PO LICY PolElems://系統(tǒng)電源策略結(jié)構(gòu)
strucl pwrschmIistnxtSchm:
//電源策略管理鏈表指針,指向下一個(gè)電源策略管理數(shù)據(jù)結(jié)構(gòu)
}PowerSchemeList,pPowerSchemeList:
DPowerSchemeList pAlIPOIicies=NULL,pLastScheme:
//定義兩個(gè)結(jié)構(gòu)變量,用來(lái)表示電源策略鏈和最后一個(gè)策略
BOOLEAN CALLBACK PS—PowerCallBack(UINT schmID.
DWORD dwNameLen.LPTSTR schmName,DWORD
dwDescLen。LPTSTR schmDesc,PPOWER.-POLlCY ppwrplcy。
LPARAM IParaml//實(shí)現(xiàn)回調(diào)函數(shù)
{pPowerschemeList curnode=(pPowerSchemeList,)calIoc(1,
sizeof(PowerschemeList)):
cumode->PoIID=schmID://保存策略標(biāo)識(shí)符
curnode->PoIName=(LPTSTR)calIoc(1,dwNameLen+1):
//計(jì)算真正的策略字符串名字
memcpy(cumode->PoIName,schmName,dwNameLen):
//保存電源策略名稱
cumOde->POINameLen=dwNameLen:
//保存電源策略名稱長(zhǎng)度
cumode->PolDesc=(LPTSTR)caIIoc(1,dwDescLen+1):
//計(jì)算電源策略描述符
memcpy(curnode一>PoIDesc,schmDesc,dwDescLen):
//保存電源策略描述符
curnOde->POIDescLen=dwDescLen:
//保存電源策略描述符長(zhǎng)度
cumode->PoIEIems=(PPOVVER_POLICY)ca¨oc(1,
sizeof(POWER—POLICY)):
memcpy(cumode->PolEIems,ppwrplcy,sizeof
(POwER—POLlCY)):
//保存系統(tǒng)電源策略
If(NULL==pA¨Policies){
DAllPolicies=curnOde:
}
eIse{
DLastScheme->nxtSchm=cumode:
//完成電源管理策略鏈表的連接
}
pLasfScheme=cumode;//計(jì)算最后的節(jié)點(diǎn)
retum(TRUE):
}
以上代碼中,數(shù)據(jù)結(jié)構(gòu)變量PowerschcreeList保存了電源管_理策略所需要的所有數(shù)據(jù),回調(diào)函數(shù)Ps PoWerCallBack用于保存電源策略,變量pAllPolicies用于遍歷所有管理策略的節(jié)點(diǎn)。
要完成鏈表的創(chuàng)建,使用以下代碼:
BOOLEAN RsIl:
RsIt=EnumPwrScheme(PS—PowerCa¨Back,0);
//枚舉所有電源策略,并保存到指定鏈表pAllPolicies隊(duì)列中
編程人員可以通過(guò)對(duì)話框來(lái)完成對(duì)電源管理策略的設(shè)置和選擇。其中關(guān)鍵的交互數(shù)據(jù)包括策略管理標(biāo)識(shí)符PolID和P0lElcms,第—個(gè)參數(shù)用來(lái)存儲(chǔ)順序號(hào),第二個(gè)參數(shù)存儲(chǔ)真正的系統(tǒng)電源策略數(shù)據(jù)結(jié)構(gòu),然后通過(guò)以下代碼完成策略的設(shè)置:
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):
恢復(fù)系統(tǒng):
SetCurrentPowerPolicies(savid,&CurrentGP,&SavCurrentPP)=
SystemParametersInf0(SPI—SETSCREENSAVETIMEOUT,
ssav,NULL,U);
2結(jié)束語(yǔ)
本文提供的方法,基本上解決了現(xiàn)代多媒體教學(xué)中常見(jiàn)的黑屏和屏幕保護(hù)等電源方面的問(wèn)題。但是計(jì)算機(jī)電源管理技術(shù)的真正應(yīng)用是多方面的,靈活使用計(jì)算機(jī)電源管理技術(shù),既可以延長(zhǎng)計(jì)算機(jī)使用壽命,又可以保證教學(xué)工作的順利進(jìn)行。希望本文能為廣大教師和機(jī)器管理人員提供一個(gè)技術(shù)參考。
(注:本文中所涉及到的圖表、注解、公式等內(nèi)容請(qǐng)以PDF格式閱讀原文。)