首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

C++ Builder 攔截系統訊息禁用螢幕保護程式

     編輯:VC 教學

問題背景

當應用程式執行長時間大量運算時,Windows 偵測不到使用者動作,會自動啟動螢幕保護程式,導致程式實際執行速度變慢,嚴重影響效能。若能在運算前暫時禁用螢幕保護,運算結束後再恢復,將大幅改善體驗。

解決原理

Windows 啟動螢幕保護前,會向當前活躍應用程式發送 WM_SYSCOMMAND 訊息,wParam = SC_SCREENSAVE。若應用程式捕獲此訊息並標記為已處理,系統即取消啟動螢幕保護。C++ Builder 的 TApplication::OnMessage 事件可攔截所有發送給應用程式的 Windows 訊息。

實作步驟

  1. 在主視窗類別的 private 區宣告處理函式:
    void __fastcall CaptureMessage(tagMSG &Msg, bool &Handled);
  2. 實作該函式,攔截 SC_SCREENSAVE:
    void __fastcall TForm1::CaptureMessage(tagMSG &Msg, bool &Handled) {
        if (Msg.message == WM_SYSCOMMAND && Msg.wParam == SC_SCREENSAVE)
            Handled = true;   // 取消螢幕保護啟動
        else
            Handled = false;  // 交由預設處理
    }
  3. 在 FormCreate 事件中註冊事件處理器:
    void __fastcall TForm1::FormCreate(TObject *Sender) {
        Application->OnMessage = CaptureMessage;
    }

驗證與注意事項

編譯執行後,將螢幕保護等待時間設為最小值測試:程式運行期間螢幕保護不會啟動,關閉程式後恢復正常。此法僅攔截 PostMessage 送達的訊息,SendMessage 直接發送的訊息不經由 OnMessage。測試環境:C++ Builder 3 / Windows 98。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved