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

C++ Builder 阻擋螢幕保護程式啟動:攔截 WM_SYSCOMMAND 實戰

     編輯:關於C++

問題情境

長時間批次運算、視訊播放、簡報模式等場景下,系統偵測不到使用者輸入會啟動螢幕保護程式,導致效能下降或畫面中斷。Windows 在啟動螢幕保護前,會向當前作用中應用程式發送 WM_SYSCOMMAND、wParam = SC_SCREENSAVE。攔截此消息並標記為「已處理」即可阻止啟動。

C++ Builder 實作方案:TApplication.OnMessage

TApplication 擁有 OnMessage 事件,可攔截應用程式層級的所有佇列消息(PostMessage 投遞),但不包含 SendMessage 直接發送的消息。

1. 事件處理器簽名

typedef void __fastcall (__closure *TMessageEvent)(tagMSG &Msg, bool &Handled);
  • Msg:標準 MSG 結構,含 hwnd、message、wParam、lParam 等。
  • Handled:設為 true 表示消息已處理,阻止後續分派;false 交由預設流程。

2. 表單類別宣告

class TForm1 : public TForm {
private:
    void __fastcall CaptureMessage(tagMSG &Msg, bool &Handled);
public:
    __fastcall TForm1(TComponent* Owner);
};

3. 實作攔截邏輯

void __fastcall TForm1::CaptureMessage(tagMSG &Msg, bool &Handled)
{
    if (Msg.message == WM_SYSCOMMAND && Msg.wParam == SC_SCREENSAVE) {
        Handled = true;   // 取消螢幕保護啟動
    } else {
        Handled = false;  // 其餘消息走預設流程
    }
}

4. 掛接事件(FormCreate)

void __fastcall TForm1::FormCreate(TObject *Sender)
{
    Application->OnMessage = CaptureMessage;
}

驗證方式

  1. 將螢幕保護等待時間設為最小值(如 1 分鐘)。
  2. 執行程式,等待超過設定時間。
  3. 觀察螢幕保護不會啟動;關閉程式後靜置,螢幕保護恢復正常。

適用環境與限制

  • 測試環境:C++ Builder 3 / Windows 98。
  • 限制:無法攔截 SendMessage 直接送達視窗程序的消息(繞過佇列)。若需全攔截,請參考 Application->HookMainWindow 或重寫視窗程序。

延伸應用

同樣機制可用於攔截 SC_MONITORPOWER(關閉螢幕)、SC_CLOSE(關閉視窗確認)等系統命令,實現更精細的電源管理與使用者體驗控制。

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