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