讓應用程式禁止Windows螢幕保護 (轉)

worldblog發表於2007-12-07
讓應用程式禁止Windows螢幕保護 (轉)[@more@]讓應用禁止螢幕保護
2000-03-21· 周新棟·世界日報
如果在你的程式中需要一個很長的時間段來進行大量的資料處理,這段時間長得足以使Windows因檢測不到動作而啟用螢幕保護程式,一旦啟動了螢幕保護程式,你的程式執行實際上就變慢了,這會大大影響程式的正常執行。有沒有一種方法,使程式在進行長時間的資料處理前關掉螢幕保護呢?答案是肯定的。Windows在啟動螢幕保護程式前會向當前啟用的應用程式傳送WM_SYMMAND訊息,其中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;
D 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(T *Sender)
{
Application->OnMessage=CaptureMessage;
}

  按F9編譯並執行程式,你可以事先將螢幕保護的等待時間設為一個儘可能小的值來檢驗程式的執行情況。你會發現在程式執行期間,螢幕保護程式將無法被啟用,關閉執行的程式後再等待一會兒,螢幕保護程式就會正常出現。以上程式碼在C++ Builder3、環境中執行透過。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-989348/,如需轉載,請註明出處,否則將追究法律責任。

相關文章