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

枚舉剪貼板所有可用資料格式完整指南 (C++ Builder 實現)

     編輯:VC 教學

前言

應用程式常需根據剪貼板內容動態啟用/禁用「貼上」功能,或針對特定格式(如 Excel 資料、RTF 富文本、自訂格式)進行處理。本文介紹如何枚舉剪貼板上所有可用格式(含標準與自訂格式),並提供 C++ Builder 完整實現代碼。

核心 API

  • OpenClipboard / CloseClipboard - 開啟/關閉剪貼板存取
  • EnumClipboardFormats - 枚舉格式:首次傳 0 獲取第一個格式,後續傳上一格式 ID 獲取下一個,返回 0 表示結束
  • GetClipboardFormatName - 獲取自訂格式的註冊名稱

標準剪貼板格式常數 (CF_ 前綴)

常數數值說明
CF_TEXT1ANSI 純文本
CF_BITMAP2位圖句柄
CF_METAFILEPICT3繪圖元檔
CF_SYLK4Symbolic Link 格式
CF_DIF5Data Interchange Format
CF_TIFF6TIFF 圖片
CF_OEMTEXT7OEM 字符集文本
CF_DIB8裝置無關位圖
CF_PALETTE9調色盤
CF_PENDATA10筆輸入資料
CF_RIFF11RIFF 音頻
CF_WAVE12WAVE 音頻
CF_UNICODETEXT13Unicode 文本 (推薦)
CF_ENHMETAFILE14增強型繪圖元檔
CF_HDROP15檔案拖放清單
CF_LOCALE16地區設定資訊
CF_MAX17預留最大值

完整 C++ Builder 實現 (VCL)

單元文件 (Unit1.h)

#ifndef Unit1H
#define Unit1H

#include 
#include 
#include 
#include 

class TForm1 : public TForm {
__published:
    TListBox *ListBox1;
    TButton *Button1;
    void __fastcall Button1Click(TObject *Sender);
private:
    String GetUnknownFormatName(UINT uFormatID);
public:
    __fastcall TForm1(TComponent* Owner);
};

extern PACKAGE TForm1 *Form1;
#endif

實現文件 (Unit1.cpp)


#include 
#pragma hdrstop
#include "Unit1.h"

#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

// 已知標準格式名稱映射表 (索引對應格式 ID)
const char* StdFormatNames[18] = {
    "", "CF_TEXT", "CF_BITMAP", "CF_METAFILEPICT", "CF_SYLK",
    "CF_DIF", "CF_TIFF", "CF_OEMTEXT", "CF_DIB", "CF_PALETTE",
    "CF_PENDATA", "CF_RIFF", "CF_WAVE", "CF_UNICODETEXT",
    "CF_ENHMETAFILE", "CF_HDROP", "CF_LOCALE", "CF_MAX"
};

__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) {}

void __fastcall TForm1::Button1Click(TObject *Sender) {
    ListBox1->Items->Clear();

    if (OpenClipboard(Handle)) {
        try {
            UINT uFormat = EnumClipboardFormats(0);
            while (uFormat != 0) {
                if (uFormat < 18)
                    ListBox1->Items->Add(StdFormatNames[uFormat]);
                else
                    ListBox1->Items->Add(GetUnknownFormatName(uFormat));
                uFormat = EnumClipboardFormats(uFormat);
            }
        }
        __finally {
            CloseClipboard();
        }
    } else {
        ShowMessage("無法開啟剪貼板,可能被其他程式佔用");
    }
}

String TForm1::GetUnknownFormatName(UINT uFormatID) {
    char szBuf[256];
    int len = GetClipboardFormatName(uFormatID, szBuf, sizeof(szBuf));
    return (len > 0) ? String(szBuf) : "Unknown Format (" + IntToStr(uFormatID) + ")";
}

進階應用技巧

1. 檢測特定格式是否可用

bool IsFormatAvailable(UINT uFormat) {
    if (!OpenClipboard(0)) return false;
    bool found = false;
    UINT fmt = EnumClipboardFormats(0);
    while (fmt) {
        if (fmt == uFormat) { found = true; break; }
        fmt = EnumClipboardFormats(fmt);
    }
    CloseClipboard();
    return found;
}

// 使用範例:檢查是否有 Excel 資料 (CF_CSV 或自訂格式)
if (IsFormatAvailable(CF_UNICODETEXT) || IsFormatAvailable(RegisterClipboardFormat("XML Spreadsheet"))) {
    // 啟用「貼上 Excel 資料」選單項
}

2. 獲取自訂格式 ID

UINT uMyCustomFormat = RegisterClipboardFormat("MyApp_CustomData_v1");
// 之後可用此 ID 檢測或讀寫自訂格式資料

3. 安全的剪貼板操作模板

template 
bool SafeClipboardOp(T operation) {
    if (!OpenClipboard(0)) return false;
    try {
        return operation();
    } __finally {
        CloseClipboard();
    }
}

測試建議

  1. 從 Word 複製富文本 → 點擊按鈕 → 觀察 CF_RTF 或 Rich Text Format 出現
  2. 從 Excel 複製儲存格 → 觀察 CF_CSV、XML Spreadsheet、HTML Format 等
  3. 從瀏覽器複製圖片 → 觀察 CF_BITMAP、CF_DIB、PNG 等
  4. 拖放檔案到表單 → 觀察 CF_HDROP

常見問題排查

  • OpenClipboard 失敗:其他視窗正在存取剪貼板,建議重試機制 (Sleep 100ms 重試 3 次)
  • EnumClipboardFormats 返回 0:剪貼板為空,或僅含無法識別的格式
  • 自訂格式名稱獲取失敗:確認格式確已用 RegisterClipboardFormat 註冊
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved