當應用程式執行長時間大量運算時,Windows 偵測不到使用者動作,會自動啟動螢幕保護程式,導致程式實際執行速度變慢,嚴重影響效能。若能在運算前暫時禁用螢幕保護,運算結束後再恢復,將大幅改善體驗。
Windows 啟動螢幕保護前,會向當前活躍應用程式發送 WM_SYSCOMMAND 訊息,wParam = SC_SCREENSAVE。若應用程式捕獲此訊息並標記為已處理,系統即取消啟動螢幕保護。C++ Builder 的 TApplication::OnMessage 事件可攔截所有發送給應用程式的 Windows 訊息。
private 區宣告處理函式:
void __fastcall CaptureMessage(tagMSG &Msg, bool &Handled);
SC_SCREENSAVE:
void __fastcall TForm1::CaptureMessage(tagMSG &Msg, bool &Handled) {
if (Msg.message == WM_SYSCOMMAND && Msg.wParam == SC_SCREENSAVE)
Handled = true; // 取消螢幕保護啟動
else
Handled = false; // 交由預設處理
}
FormCreate 事件中註冊事件處理器:
void __fastcall TForm1::FormCreate(TObject *Sender) {
Application->OnMessage = CaptureMessage;
}
編譯執行後,將螢幕保護等待時間設為最小值測試:程式運行期間螢幕保護不會啟動,關閉程式後恢復正常。此法僅攔截 PostMessage 送達的訊息,SendMessage 直接發送的訊息不經由 OnMessage。測試環境:C++ Builder 3 / Windows 98。