如果在你的程式中需要一個很長的時間段來進行大量的資料處理,這段時間長得足以使Windows因檢測不到使用者動作而啟用螢幕保護裝置程式,一旦啟動了螢幕保護裝置程式,你的程式運行實際上就變慢了,這會大大影響程式的正常運行。有沒有一種方法,使程式在進行長時間的資料處理前關掉螢幕保護裝置呢?答案是肯定的。Windows在啟動螢幕保護裝置程式前會向當前啟用的應用程式發送WM_SYSCOMMAND訊息,其中wParam參數指定了即將執行的系統命令類型,在本例中其值為SC_SCREENSAVE。問題在於程式如何捕獲這個訊息呢?在C++ Builder中可以利用TApplication類的OnMessage事件控制代碼來處理這個訊息。應用程式在接收到任何Windows訊息後都會觸發TApplication類的OnMessage事件,通過定義這個事件的處理常式,可以捕獲發送給應用程式的所有Windows訊息(這當然不包括在程式中用SendMessage函數發送的訊息)。
OnMessage事件的定義如下:
typedef void__fastcall(__closure
*TMessageEvent)(tagMSG amp;Msg,boolamp;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 amp;Msg,bool amp;Handled);
public:
__fastcall TForm1(TComponent* Owner);
};
在.cpp檔案中增加CaptureMessage的定義:
void __fastcall TForm1::CaptureMessage(tagMSG amp;Msg,bool amp;Handled)
{
if(Msg.message= =WM_SYSCOMMAND amp;amp; Msg.wParam= =SC_SCREENSAVE)
Handled=true; //阻止螢幕保護裝置的啟動
else
Handled=false; //進行該訊息的預設處理
}
再將定義好的CaptureMessage函數作為OnMessage事件的事件處理器,將以下代碼加到主表單的OnCreate事件處理器中:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Application-gt;OnMessage=CaptureMessage;
}
按F9編譯並運行程式,你可以事先將螢幕保護裝置的等待時間設為一個儘可能小的值來檢驗程式的運行情況。你會發現在程式運行期間,螢幕保護裝置程式將無法被啟用,關閉啟動並執行程式後再等待一會兒,螢幕保護裝置程式就會正常出現。以上代碼在C++ Builder3、win98環境中運行通過。
發送給應用程式的所有Windows訊息(這當然不包括在程式中用SendMessage函數發送的訊息)。
OnMessage事件的定義如下:
typedef void__fastcall(__closure
*TMessageEvent)(tagMSG amp;Msg,boolamp;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 amp;Msg,bool amp;Handled);
public:
__fastcall TForm1(TComponent* Owner);
};
在.cpp檔案中增加CaptureMessage的定義:
void __fastcall TForm1::CaptureMessage(tagMSG amp;Msg,bool amp;Handled)
{
if(Msg.message= =WM_SYSCOMMAND amp;amp; Msg.wParam= =SC_SCREENSAVE)
Handled=true; //阻止螢幕保護裝置的啟動
else
Handled=false; //進行該訊息的預設處理
}
再將定義好的CaptureMessage函數作為OnMessage事件的事件處理器,將以下代碼加到主表單的OnCreate事件處理器中:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Application-gt;OnMessage=CaptureMessage;
}
按F9編譯並運行程式,你可以事先將螢幕保護裝置的等待時間設為一個儘可能小的值來檢驗程式的運行情況。你會發現在程式運行期間,螢幕保護裝置程式將無法被啟用,關閉啟動並執行程式後再等待一會兒,螢幕保護裝置程式就會正常出現。以上代碼在C++ Builder3、win98環境中運行通過。