如果在你的程序中需要一個很長的時間段來進行大量的數據處理,這段時間長得足以使Windows因檢測不到用戶動作而激活屏幕保護程序,一旦啟動了屏幕保護程序,你的程序運行實際上就變慢了,這會大大影響程序的正常運行。有沒有一種方法,使程序在進行長時間的數據處理前關掉屏幕保護呢?答案是肯定的。Windows在啟動屏幕保護程序前會向當前激活的應用程序發送WM_SYSCOMMAND消息,其中wParam參數指定了即將執行的系統命令類型,在本例中其值為SC_SCREENSAVE。問題在於程序如何捕獲這個消息呢?在C++ Builder中可以利用TApplication類的OnMessage事件句柄來處理這個消息。應用程序在接收到任何Windows消息後都會觸發TApplication類的OnMessage事件,通過定義這個事件的處理程序,可以捕獲發送給應用程序的所有Windows消息(這當然不包括在程序中用SendMessage函數發送的消息)。
OnMessage事件的定義如下:
typedef void__fastcall(__closure *TMessageEvent)(tagMSG &Msg,bool&Handled);
__property TMessageEvent OnMessage={read=FOnMessage,write=FOnMessage};
其中TMessageEvent類型是OnMessage事件的類型,它定義了處理消息的方法,Msg參數給出了Windows消息的相關信息,其結構如下:
typedef struct tagMSG
{
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
}
Handled參數決定了如何對消息進行下一步處理,如果在接收到一個消息後將Handled參數設為true,則這個消息將不會得到進一步的處理,在本例中就是取消屏幕保護程序的激活。
啟動C++ Builder,新建一工程文件,在頭文件中的Private段增加對成員函數CaptureMessage的聲明:
class TForm1 : public TForm
{
__published:
private:
void __fastcall CaptureMessage(tagMSG &Msg,bool &Handled);
public:
__fastcall TForm1(TComponent* Owner);
};
在.cpp文件中增加CaptureMessage的定義:
void __fastcall TForm1::CaptureMessage(tagMSG &Msg,bool &Handled)
{
if(Msg.message= =WM_SYSCOMMAND && Msg.wParam= =SC_SCREENSAVE)
Handled=true; //阻止屏幕保護的啟動
else
Handled=false; //進行該消息的缺省處理
}
再將定義好的CaptureMessage函數作為OnMessage事件的事件處理器,將以下代碼加到主窗體的OnCreate事件處理器中:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Application->OnMessage=CaptureMessage;
}
按F9編譯並運行程序,你可以事先將屏幕保護的等待時間設為一個盡可能小的值來檢驗程序的運行情況。你會發現在程序運行期間,屏幕保護程序將無法被激活,關閉運行的程序後再等待一會兒,屏幕保護程序就會正常出現。以上代碼在C++ Builder3、win98環境中運行通過。