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

C# 剪貼簿程式設計完全指南:資料型別判斷與儲存實作

     編輯:關於C#

前言:為什麼剪貼簿操作是必修課?

在桌面應用開發中,剪貼簿是使用者交換資料的核心通道。無論是截圖工具、文件編輯器,還是跨應用程式拖放功能,都離不開對剪貼簿資料的讀寫與型別識別。本文系統梳理 C# 操作剪貼簿的兩大核心場景——資料型別判斷與資料擷取儲存,並提供可直接落地的完整程式碼範例。

核心類別與介面速查表

類別/介面命名空間核心功能
ClipboardSystem.Windows.Forms靜態類別,提供 GetDataObject()、SetDataObject() 等存取方法
DataFormatsSystem.Windows.Forms預定義剪貼簿資料格式常數(Text、Bitmap、Html、FileDrop 等 21 種)
IDataObjectSystem.Windows.Forms資料傳輸介面,提供 GetDataPresent()、GetData() 等型別檢查與擷取方法

場景一:判斷剪貼簿當前資料型別

核心邏輯

  1. 呼叫 Clipboard.GetDataObject() 取得 IDataObject 介面實例
  2. 使用 GetDataPresent(DataFormats.Format) 依優先順序檢查型別
  3. 回傳 true 表示符合或可轉換為指定格式

主控台應用程式範例

using System;
using System.Windows.Forms;

public class ClipboardTypeDetector
{
    public static void Main()
    {
        IDataObject data = Clipboard.GetDataObject();

        if (data.GetDataPresent(DataFormats.Bitmap))
            Console.WriteLine("剪貼簿資料型別:位圖");
        else if (data.GetDataPresent(DataFormats.Text))
            Console.WriteLine("剪貼簿資料型別:純文字");
        else if (data.GetDataPresent(DataFormats.Html))
            Console.WriteLine("剪貼簿資料型別:HTML 格式");
        else if (data.GetDataPresent(DataFormats.FileDrop))
            Console.WriteLine("剪貼簿資料型別:檔案清單");
        else
            Console.WriteLine("剪貼簿資料型別:其他 (" + data.GetDataPresent(DataFormats.UnicodeText) + ")");
    }
}

場景二:擷取並儲存剪貼簿資料

關鍵技術點:拆箱與型別轉換

IDataObject.GetData() 回傳 object(參考型別),必須透過強制轉型拆箱為實值型別:

Bitmap bmp = (Bitmap)data.GetData(DataFormats.Bitmap);  // 位圖拆箱
string txt = (string)data.GetData(DataFormats.Text);    // 字串拆箱

Windows Forms 完整實作:自動儲存圖片/顯示文字

剪貼簿為位圖時自動儲存為 my.bmp 圖 01:偵測到位圖時自動存檔至 C:\my.bmp

剪貼簿為文字時顯示於 RichTextBox 圖 02:偵測到文字時載入 RichTextBox 顯示

using System;
using System.Drawing;
using System.Windows.Forms;

public class ClipboardSaverForm : Form
{
    private RichTextBox richTextBox1;
    private Button btnGetData;

    public ClipboardSaverForm()
    {
        InitializeComponent();
    }

    private void InitializeComponent()
    {
        this.richTextBox1 = new RichTextBox { Location = new Point(40, 16), Size = new Size(336, 264) };
        this.btnGetData = new Button { Location = new Point(128, 304), Text = "取得剪貼簿資料", Size = new Size(128, 24) };
        this.btnGetData.Click += BtnGetData_Click;

        this.ClientSize = new Size(408, 357);
        this.Controls.AddRange(new Control[] { richTextBox1, btnGetData });
        this.Text = "C# 剪貼簿資料擷取與儲存示範";
    }

    private void BtnGetData_Click(object sender, EventArgs e)
    {
        IDataObject data = Clipboard.GetDataObject();

        if (data.GetDataPresent(DataFormats.Bitmap))
        {
            Bitmap bmp = (Bitmap)data.GetData(DataFormats.Bitmap);
            bmp.Save(@"c:\my.bmp");
            MessageBox.Show("已將位圖儲存至 C:\\my.bmp");
        }
        else if (data.GetDataPresent(DataFormats.Text))
        {
            string txt = (string)data.GetData(DataFormats.Text);
            richTextBox1.Text = txt;
        }
        else
        {
            MessageBox.Show("剪貼簿包含非支援格式資料");
        }
    }

    [STAThread]
    public static void Main()
    {
        Application.Run(new ClipboardSaverForm());
    }
}

進階應用延伸:打造截圖工具雛形

掌握上述基礎後,你可以輕鬆實作:

  • 螢幕截圖工具:SendKeys.SendWait("{PRTSC}") 觸發列印螢幕鍵 → 從剪貼簿取得 Bitmap → 裁切 → 儲存
  • 格式轉換器:偵測 HTML 格式 → 解析轉為 Markdown/純文字 → 寫回剪貼簿
  • 跨應用同步:監聽剪貼簿變更事件(需 P/Invoke AddClipboardFormatListener)→ 即時同步至雲端/其他裝置

常見坑點與解決方案

問題原因解決方法
呼叫 Clipboard 方法拋出 ExternalException剪貼簿被其他程式佔用加入重試機制(Thread.Sleep + try/catch 迴圈),最多重試 3-5 次
GetDataPresent(Text) 為 true 但 GetData(Text) 回傳 null資料為 UnicodeText 非 ANSI Text優先檢查 DataFormats.UnicodeText,或使用 GetData(DataFormats.UnicodeText)
非 UI 執行緒存取剪貼簿失效Clipboard 類別要求 STA 執行緒確保呼叫端標記 [STAThread],或使用 Task.Run 配合 Dispatcher/Control.Invoke

總結

C# 操作剪貼簿的核心在於 Clipboard → IDataObject → DataFormats 三角關係。掌握 GetDataPresent 型別檢查與 GetData 拆箱轉換兩大關鍵步驟,即可應對 90% 的剪貼簿應用場景。建議開發者將常用邏輯封裝為靜態工具類 ClipboardHelper,統一處理例外、重試與編碼轉換,提升專案維護性。

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