應(yīng)用程序禁止Windows屏幕保護(hù)
如果在你的程序中需要一個(gè)很長(zhǎng)的時(shí)間段來進(jìn)行大量的數(shù)據(jù)處理,這段時(shí)間長(zhǎng)得足以使Windows因檢測(cè)不到用戶動(dòng)作而激活屏幕保護(hù)程序,一旦啟動(dòng)了屏幕保護(hù)程序,你的程序運(yùn)行實(shí)際上就變慢了,這會(huì)大大影響程序的正常運(yùn)行。有沒有一種應(yīng)用程序可以在進(jìn)行長(zhǎng)時(shí)間的數(shù)據(jù)處理前關(guān)掉屏幕保護(hù)呢?答案是肯定的。Windows在啟動(dòng)屏幕保護(hù)程序前會(huì)向當(dāng)前激活的應(yīng)用程序發(fā)送WM_SYSCOMMAND消息,其中wParam參數(shù)指定了即將執(zhí)行的系統(tǒng)命令類型,在本例中其值為SC_SCREENSAVE。問題在于程序如何捕獲這個(gè)消息呢?在C Builder中可以利用TApplication類的OnMessage事件句柄來處理這個(gè)消息。應(yīng)用程序在接收到任何Windows消息后都會(huì)觸發(fā)TApplication類的OnMessage事件,通過定義這個(gè)事件的處理程序,可以捕獲發(fā)送給應(yīng)用程序的所有Windows消息(這當(dāng)然不包括在程序中用SendMessage函數(shù)發(fā)送的消息)。
OnMessage事件的定義如下:
- typedefvoid__fastcall(__closure
- *TMessageEvent)(tagMSG&Msg,bool&Handled);
- __propertyTMessageEventOnMessage=
- {read=FOnMessage,write=FOnMessage};
其中TMessageEvent類型是OnMessage事件的類型,它定義了處理消息的方法,Msg參數(shù)給出了Windows消息的相關(guān)信息,其結(jié)構(gòu)如下:
- typedefstructtagMSG{
- HWNDhwnd;
- UINTmessage;
- WPARAMwParam;
- LPARAMlParam;
- DWORDtime;
- POINTpt;}
Handled參數(shù)決定了如何對(duì)消息進(jìn)行下一步處理,如果在接收到一個(gè)消息后將Handled參數(shù)設(shè)為true,則這個(gè)消息將不會(huì)得到進(jìn)一步的處理,在本例中就是取消屏幕保護(hù)程序的激活。
啟動(dòng)C Builder,新建一工程文件,在頭文件中的Private段增加對(duì)成員函數(shù)CaptureMessage的聲明:
- classTForm1:publicTForm
- {
- __published:
- private:
- void__fastcallCaptureMessage(tagMSG&Msg,bool&Handled);
- public:
- __fastcallTForm1(TComponent*Owner);
- };
在.cpp文件中增加CaptureMessage的定義:
- void__fastcallTForm1::CaptureMessage(tagMSG&Msg,bool&Handled)
- {
- if(Msg.message==WM_SYSCOMMAND&&Msg.wParam==SC_SCREENSAVE)
- Handled=true;//阻止屏幕保護(hù)的啟動(dòng)
- else
- Handled=false;//進(jìn)行該消息的缺省處理
- }
再將定義好的CaptureMessage函數(shù)作為OnMessage事件的事件處理器,將以下代碼加到主窗體的OnCreate事件處理器中:
- void__fastcallTForm1::FormCreate(TObject*Sender)
- {
- Application->OnMessage=CaptureMessage;
- }
編譯并運(yùn)行程序,你可以事先將屏幕保護(hù)的等待時(shí)間設(shè)為一個(gè)盡可能小的值來檢驗(yàn)程序的運(yùn)行情況。你會(huì)發(fā)現(xiàn)在程序運(yùn)行期間,屏幕保護(hù)程序?qū)o法被激活,關(guān)閉運(yùn)行的程序后再等待一會(huì)兒,屏幕保護(hù)程序就會(huì)正常出現(xiàn)。以上代碼在C Builder3、win98環(huán)境中運(yùn)行通過。
【編輯推薦】