程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 應用程序禁止Windows屏幕保護

應用程序禁止Windows屏幕保護

編輯:C++入門知識

如果在你的程序中需要一個很長的時間段來進行大量的數據處理,這段時間長得足以使Windows因檢測不到用戶動作而激活屏幕保護程序,一旦啟動了屏幕保護程序,你的程序運行實際上就變慢了,這會大大影響程序的正常運行。有沒有一種應用程序可以在進行長時間的數據處理前關掉屏幕保護呢?答案是肯定的。Windows在啟動屏幕保護程序前會向當前激活的應用程序發送WM_SYSCOMMAND消息,其中wParam參數指定了即將執行的系統命令類型,在本例中其值為SC_SCREENSAVE。問題在於程序如何捕獲這個消息呢?在C Builder中可以利用TApplication類的OnMessage事件句柄來處理這個消息。應用程序在接收到任何Windows消息後都會觸發TApplication類的OnMessage事件,通過定義這個事件的處理程序,可以捕獲發送給應用程序的所有Windows消息(這當然不包括在程序中用SendMessage函數發送的消息)。

OnMessage事件的定義如下:

  1. typedefvoid__fastcall(__closure  
  2. *TMessageEvent)(tagMSG&Msg,bool&Handled);  
  3. __propertyTMessageEventOnMessage=  
  4. {read=FOnMessage,write=FOnMessage}; 

其中TMessageEvent類型是OnMessage事件的類型,它定義了處理消息的方法,Msg參數給出了Windows消息的相關信息,其結構如下:

  1. typedefstructtagMSG{  
  2. HWNDhwnd;  
  3. UINTmessage;  
  4. WPARAMwParam;  
  5. LPARAMlParam;  
  6. DWORDtime;  
  7. POINTpt;} 

Handled參數決定了如何對消息進行下一步處理,如果在接收到一個消息後將Handled參數設為true,則這個消息將不會得到進一步的處理,在本例中就是取消屏幕保護程序的激活。

啟動C Builder,新建一工程文件,在頭文件中的Private段增加對成員函數CaptureMessage的聲明:

  1. classTForm1:publicTForm  
  2. {  
  3. __published:  
  4. private:  
  5. void__fastcallCaptureMessage(tagMSG&Msg,bool&Handled);  
  6. public:  
  7. __fastcallTForm1(TComponent*Owner);  
  8. }; 

在.cpp文件中增加CaptureMessage的定義:

  1. void__fastcallTForm1::CaptureMessage(tagMSG&Msg,bool&Handled)  
  2. {  
  3. if(Msg.message==WM_SYSCOMMAND&&Msg.wParam==SC_SCREENSAVE)  
  4. Handled=true;//阻止屏幕保護的啟動  
  5. else 
  6. Handled=false;//進行該消息的缺省處理  

再將定義好的CaptureMessage函數作為OnMessage事件的事件處理器,將以下代碼加到主窗體的OnCreate事件處理器中:

  1. void__fastcallTForm1::FormCreate(TObject*Sender)  
  2. {  
  3. Application->OnMessage=CaptureMessage;  

編譯並運行程序,你可以事先將屏幕保護的等待時間設為一個盡可能小的值來檢驗程序的運行情況。你會發現在程序運行期間,屏幕保護程序將無法被激活,關閉運行的程序後再等待一會兒,屏幕保護程序就會正常出現。以上代碼在C Builder3、win98環境中運行通過。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved