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

C++ Builder 剪貼板監視完整實現:從訊息鉤子到右鍵選單彈出

     編輯:VC 教學

Windows 剪貼板監視機制與 C++ Builder 實戰

剪貼板是進程間資料交換的核心通道。本文詳細講解如何在 C++ Builder 中實現剪貼板變更監視,並示範變更時自動彈出右鍵選單的完整技術路徑。

核心機制:剪貼板檢視器鏈

Windows 維護一個剪貼板檢視器鏈,每個監視視窗透過 SetClipboardViewer 加入鏈頭,ChangeClipboardChain 移除。收到 WM_DRAWCLIPBOARD 訊息表示剪貼板內容變更,必須呼叫 SendMessage 轉發給鏈中下一個視窗。

C++ Builder 實現三步驟

1. 訊息映射宣告(.h 檔)

private:
    void __fastcall ClipboardChanged(TMessage& Msg);
public:
    BEGIN_MESSAGE_MAP
        MESSAGE_HANDLER(WM_DRAWCLIPBOARD, TMessage, ClipboardChanged)
    END_MESSAGE_MAP(TForm)

MESSAGE_HANDLER 將特定訊息導向自定處理函數,避免巨大的 WndProc switch-case。

2. 訊息處理邏輯(.cpp 檔)

void __fastcall TForm1::ClipboardChanged(TMessage& Msg) {
    POINT MousePos;
    GetCursorPos(&MousePos);
    PopupMenu4->PopupComponent = Form1;
    PopupMenu4->Popup(MousePos.x, MousePos.y);
    // 關鍵:必須轉發訊息給鏈中下一個視窗
    SendMessage(NextViewer, Msg.Msg, Msg.WParam, Msg.LParam);
}

此範例在滑鼠位置彈出選單,實際應用可改為記錄變更歷史、同步遠端剪貼板等。

3. 監視啟動/停止控制

void __fastcall TForm1::ToolButton9Click(TObject *Sender) {
    static HWND LastHandle;
    static bool clip = false;
    if (clip) {
        ToolButton9->Down = false;
        ChangeClipboardChain(Form1->Handle, LastHandle);
    } else {
        ToolButton9->Down = true;
        Clipboard()->Clear();          // 可選:清空剪貼板
        Application->Minimize();       // 可選:最小化視窗
        LastHandle = SetClipboardViewer(Form1->Handle);
    }
    clip = !clip;
}

按鈕切換監視狀態,LastHandle 保存鏈中原本的下一個視窗,停止時正確移除自身。

進階應用與注意事項

  • 格式檢查:Clipboard()->HasFormat(CF_TEXT) 判斷是否有文字格式
  • 資料讀取:Clipboard()->AsText 直接取得文字內容
  • 多格式支援:EnumClipboardFormats 列舉所有可用格式
  • Vista+ 相容性:新版 Windows 加強剪貼板安全性,可能需 AddClipboardFormatListener 替代舊鏈機制
  • 效能考量:頻繁變更(如拖曳選取)會大量觸發訊息,處理函數務必輕量

完整應用場景範例

  1. 自動記錄剪貼板歷史,支援多項快速貼上
  2. 跨裝置同步:監視變更 → 上傳雲端 → 其他裝置拉取寫入
  3. 敏感資料防洩漏:偵測特定格式/關鍵字 → 警告/阻擋/審計
  4. 富文本編輯器:根據剪貼板格式動態啟用/停用貼上/貼上純文字選單項

本技術結合 OnIdle 事件(見相關文章)可構建專業級剪貼板增強工具。

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