封裝 System.Windows.Forms.Clipboard,提供安全的純文字存取,自動處理 COM 例外與資料格式檢查。
using System;
using System.Windows.Forms;
public static class ClipboardHandler
{
/// 剪貼簿是否包含 Unicode 文字
public static bool CanGetText()
{
try
{
IDataObject data = Clipboard.GetDataObject();
return data != null && data.GetDataPresent(DataFormats.UnicodeText);
}
catch
{
return false;
}
}
/// 設定剪貼簿文字(Unicode),成功回傳 true
public static bool SetTextToClipboard(string text)
{
if (string.IsNullOrEmpty(text)) return false;
try
{
var dataObj = new DataObject();
dataObj.SetData(DataFormats.UnicodeText, true, text);
Clipboard.SetDataObject(dataObj, true); // true = 複本保留於剪貼簿
return true;
}
catch
{
return false;
}
}
/// 取得剪貼簿文字,失敗回傳 null
public static string GetTextFromClipboard()
{
try
{
IDataObject data = Clipboard.GetDataObject();
if (data.GetDataPresent(DataFormats.UnicodeText))
return (string)data.GetData(DataFormats.UnicodeText);
}
catch { }
return null;
}
}
// 寫入
if (ClipboardHandler.SetTextToClipboard("Hello, Clipboard!"))
Console.WriteLine("寫入成功");
// 讀取
if (ClipboardHandler.CanGetText())
{
string text = ClipboardHandler.GetTextFromClipboard();
Console.WriteLine("讀取: " + text);
}
| 細節 | 說明 |
|---|---|
DataFormats.UnicodeText | 優先使用 Unicode 格式,避免 ANSI 編碼亂碼 |
SetData(..., true, text) | 第二參數 autoConvert=true,允許自動轉換相容格式 |
SetDataObject(obj, true) | 第二參數 copy=true,應用程式結束後資料仍保留在剪貼簿 |
| try-catch 包裹 | Clipboard 操作易拋 ExternalException / ThreadStateException,全捕獲轉為失敗回傳 |
| STAThread | 呼叫執行緒必須標記 [STAThread](WinForms/WPF 預設滿足) |
DataFormats.Html、DataFormats.Rtf、DataFormats.FileDrop 等格式。Thread.Sleep(10) + retry 3 次)應對偶發佔用衝突。System.Windows.Clipboard,API 類似但命名空間不同。