C#でクリップボードにコピー・取得する方法|SetText/GetTextの使い方とエラー対策まで解説
はじめに
C#でクリップボードを操作できるようになると、アプリ内の文字列をワンクリックでコピーしたり、ユーザーがコピーした内容を取得してTextBoxへ貼り付けたりできます。
たとえば、次のような処理を実装できます。
C#Clipboard.SetText("コピーする文字列");
string text = Clipboard.GetText();
ただし、C#のクリップボード操作では、実行環境によって参照するクラスが異なったり、STAスレッドが必要だったり、他のアプリがクリップボードを使用中だと例外が発生したりする点に注意が必要です。
この記事では、C#でクリップボードにコピーする方法、クリップボードから文字列を取得する方法、削除・上書き・形式指定・エラー対策まで、実用的なサンプルコード付きで解説します。
1. C#でクリップボード操作を実装する前に知っておくこと
C#でクリップボードを扱う場合、まず「どのアプリ形式で実装するのか」を意識する必要があります。
WinForms、WPF、コンソールアプリでは、同じようにClipboard.SetTextやClipboard.GetTextを使える場面がありますが、参照する名前空間やプロジェクト設定、スレッドの扱いが異なります。
特にコンソールアプリでクリップボードを操作する場合は、[STAThread]属性を付け忘れるとエラーになることが多いため、最初に基本を押さえておきましょう。
1-1. クリップボード操作でできること:コピー・取得・削除・形式指定
C#のClipboardクラスを使うと、主に次のような操作ができます。
C#// 文字列をコピーする
Clipboard.SetText("Hello");
// 文字列を取得する
string text = Clipboard.GetText();
// クリップボードを空にする
Clipboard.Clear();
// テキストが存在するか確認する
bool hasText = Clipboard.ContainsText();
クリップボード操作では、単純なテキストだけでなく、HTML、RTF、画像、ファイル一覧なども扱えます。
たとえば、文字列を扱うだけならSetTextとGetTextで十分です。一方で、複数の形式を同時にクリップボードへ入れたい場合や、独自形式のデータを扱いたい場合はSetDataObjectやGetDataObjectを使います。
よく使う操作は次のとおりです。
| 操作 | 主なメソッド |
|---|---|
| 文字列をコピーする | SetText |
| 文字列を取得する | GetText |
| 文字列があるか確認する | ContainsText |
| 内容を削除する | Clear |
| 複数形式のデータをコピーする | SetDataObject |
| データ形式を指定して取得する | GetData / GetDataObject |
1-2. C#で使う主なClipboardクラスの種類:Windows FormsとWPFの違い
C#で使える代表的なClipboardクラスには、Windows Forms用とWPF用があります。
WinFormsでは次のクラスを使います。
C#System.Windows.Forms.Clipboard
WPFでは次のクラスを使います。
C#System.Windows.Clipboard
どちらもSetTextやGetTextという似た名前のメソッドを持っていますが、名前空間が異なります。
WinFormsの場合は、次のようにusingを追加します。
C#using System.Windows.Forms;
WPFの場合は、次のようにusingを追加します。
C#using System.Windows;
注意点として、WinFormsとWPFを同じファイル内で同時に使うと、Clipboardという名前が衝突することがあります。その場合は、完全修飾名で書くと安全です。
C#System.Windows.Forms.Clipboard.SetText("WinFormsのClipboard");
System.Windows.Clipboard.SetText("WPFのClipboard");
通常は、WinFormsアプリならSystem.Windows.Forms.Clipboard、WPFアプリならSystem.Windows.Clipboardを使えば問題ありません。
1-3. Clipboardを使うために必要な参照・using・プロジェクト設定
WinFormsアプリでは、通常はプロジェクト作成時点でWindows Forms関連の参照が設定されています。
C#using System.Windows.Forms;
基本コードは次のようになります。
C#using System;
using System.Windows.Forms;
public class Sample
{
public void Copy()
{
Clipboard.SetText("コピーする文字列");
}
}
.NET 6以降や.NET 8などのSDKスタイルのプロジェクトで、コンソールアプリからWinFormsのClipboardを使う場合は、プロジェクトファイルにWindows向けの設定が必要になることがあります。
例として、.csprojに次のような設定を入れます。
XML<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0-windows</TargetFramework>
<UseWindowsForms>true</UseWindowsForms>
</PropertyGroup>
</Project>
WPFの場合は、次のような設定です。
XML<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net8.0-windows</TargetFramework>
<UseWPF>true</UseWPF>
</PropertyGroup>
</Project>
.NET FrameworkのWinFormsやWPFでは、Visual Studioでプロジェクトを作成すれば必要な参照は自動的に追加されていることが多いです。
1-4. コンソールアプリ・WinForms・WPFで実装時に注意すべき違い
WinFormsやWPFのアプリでは、通常メインスレッドがSTAで動作するように設定されています。そのため、ボタンクリックなどのUIイベント内でClipboardを操作する場合は、比較的そのまま動作します。
一方、コンソールアプリでは注意が必要です。ClipboardはSTAスレッドで実行する必要があるため、Mainメソッドに[STAThread]を付けます。
C#using System;
using System.Windows.Forms;
internal class Program
{
[STAThread]
static void Main()
{
Clipboard.SetText("コンソールアプリからコピー");
Console.WriteLine("クリップボードにコピーしました。");
}
}
[STAThread]がない状態でClipboardを操作すると、次のようなエラーが発生する場合があります。
現在のスレッドはSTAモードである必要があります。
また、Task.RunやThreadで別スレッドからClipboardを操作する場合も注意が必要です。別スレッドがMTAになっていると、同じようにClipboard操作に失敗する可能性があります。
基本的には、Clipboard操作はUIスレッドで行うのが安全です。
2. C#でクリップボードに文字列をコピーする方法
C#でクリップボードに文字列をコピーする基本は、Clipboard.SetTextです。
最もシンプルなコードは次のとおりです。
C#Clipboard.SetText("コピーしたい文字列");
この1行で、指定した文字列がWindowsのクリップボードに保存されます。その後、メモ帳やブラウザ、Excelなど別のアプリで貼り付けることができます。
2-1. Clipboard.SetTextでテキストをコピーする基本コード
WinFormsで文字列をコピーする基本コードは次のとおりです。
C#using System;
using System.Windows.Forms;
public class ClipboardSample
{
public void CopyText()
{
Clipboard.SetText("C#でクリップボードにコピーしました。");
}
}
コンソールアプリで実行する場合は、[STAThread]を付けます。
C#using System;
using System.Windows.Forms;
internal class Program
{
[STAThread]
static void Main()
{
Clipboard.SetText("Hello Clipboard");
Console.WriteLine("コピーしました。");
}
}
WPFの場合は、System.Windows.Clipboardを使います。
C#using System.Windows;
public class ClipboardSample
{
public void CopyText()
{
Clipboard.SetText("WPFでコピーしました。");
}
}
Clipboard.SetTextは、コピー処理を簡単に書ける反面、引数にnullや空文字列を渡すと例外になる場合があります。そのため、実用コードでは事前チェックを入れることをおすすめします。
C#string text = "コピーする文字列";
if (!string.IsNullOrEmpty(text))
{
Clipboard.SetText(text);
}
2-2. TextBoxや変数の値をクリップボードにコピーするサンプル
WinFormsでTextBoxの内容をコピーする場合は、ボタンクリックイベント内に次のように書きます。
C#private void buttonCopy_Click(object sender, EventArgs e)
{
string text = textBox1.Text;
if (!string.IsNullOrEmpty(text))
{
Clipboard.SetText(text);
MessageBox.Show("クリップボードにコピーしました。");
}
else
{
MessageBox.Show("コピーする文字列がありません。");
}
}
変数の値をコピーする場合も同じです。
C#private void CopyUserName()
{
string userName = "山田太郎";
if (!string.IsNullOrEmpty(userName))
{
Clipboard.SetText(userName);
}
}
URLをコピーするサンプルは次のとおりです。
C#private void buttonCopyUrl_Click(object sender, EventArgs e)
{
string url = "https://example.com";
Clipboard.SetText(url);
MessageBox.Show("URLをコピーしました。");
}
フォーム上の複数の値を連結してコピーすることもできます。
C#private void buttonCopyInfo_Click(object sender, EventArgs e)
{
string name = textBoxName.Text;
string email = textBoxEmail.Text;
string text = $"名前: {name}{Environment.NewLine}メール: {email}";
if (!string.IsNullOrWhiteSpace(text))
{
Clipboard.SetText(text);
}
}
改行を含めたい場合は、Environment.NewLineを使うと環境に合った改行コードになります。
2-3. 空文字列・nullをコピーするときの注意点
Clipboard.SetTextにnullを渡すと例外が発生します。また、WinFormsのClipboard.SetTextでは空文字列を渡した場合にも例外になることがあります。
そのため、次のようなコードは避けたほうが安全です。
C#string text = null;
Clipboard.SetText(text); // 例外の原因になる
空文字列の場合も注意が必要です。
C#string text = "";
Clipboard.SetText(text); // 実行環境によっては例外の原因になる
安全にコピーするには、string.IsNullOrEmptyまたはstring.IsNullOrWhiteSpaceでチェックします。
C#string text = textBox1.Text;
if (!string.IsNullOrEmpty(text))
{
Clipboard.SetText(text);
}
else
{
MessageBox.Show("コピーする文字列が空です。");
}
空白だけの文字列もコピー対象外にしたい場合は、IsNullOrWhiteSpaceを使います。
C#if (!string.IsNullOrWhiteSpace(text))
{
Clipboard.SetText(text);
}
「空文字列でクリップボードを空にしたい」という目的でSetText("")を使うのはおすすめしません。クリップボードを空にしたい場合は、Clipboard.Clear()を使いましょう。
C#Clipboard.Clear();
2-4. コピー後に別アプリへ貼り付けできるか確認する方法
Clipboard.SetTextでコピーした文字列は、通常、別アプリへ貼り付けできます。
確認するには、次の手順でチェックします。
C#アプリでコピー処理を実行する
メモ帳など別アプリを開く
Ctrl + Vで貼り付けるコピーした文字列が表示されるか確認する
コード上で確認する場合は、コピー直後にClipboard.GetTextで取得して比較できます。
C#string original = "コピー確認用テキスト";
Clipboard.SetText(original);
string copied = Clipboard.GetText();
if (original == copied)
{
MessageBox.Show("コピーできています。");
}
else
{
MessageBox.Show("コピー内容が一致しません。");
}
ただし、コピー直後に他のアプリや処理がクリップボードを書き換える可能性もあります。通常の確認であれば、GetTextで取得できるかを見るだけで十分です。
C#if (Clipboard.ContainsText())
{
string text = Clipboard.GetText();
MessageBox.Show("現在のクリップボード: " + text);
}
3. C#でクリップボードの文字列を取得する方法
C#でクリップボードから文字列を取得するには、Clipboard.GetTextを使います。
C#string text = Clipboard.GetText();
ただし、クリップボードにテキストが入っていない場合もあります。そのため、実用的にはContainsTextで確認してからGetTextを呼び出すのがおすすめです。
3-1. Clipboard.GetTextでテキストを取得する基本コード
WinFormsでクリップボードの文字列を取得する基本コードは次のとおりです。
C#using System.Windows.Forms;
string text = Clipboard.GetText();
ボタンクリックで取得する例です。
C#private void buttonPaste_Click(object sender, EventArgs e)
{
string text = Clipboard.GetText();
textBox1.Text = text;
}
WPFの場合は次のように書きます。
C#using System.Windows;
string text = Clipboard.GetText();
WPFのボタンクリックイベントでは次のように使えます。
C#private void ButtonPaste_Click(object sender, RoutedEventArgs e)
{
string text = Clipboard.GetText();
textBox1.Text = text;
}
クリップボードに文字列がない場合、GetTextは空文字列を返すことがあります。そのため、空文字列が返ってきた場合も想定しておきましょう。
3-2. ContainsTextでテキストが存在するか確認してから取得する
安全に取得するには、Clipboard.ContainsText()を使います。
C#if (Clipboard.ContainsText())
{
string text = Clipboard.GetText();
textBox1.Text = text;
}
else
{
MessageBox.Show("クリップボードにテキストがありません。");
}
ContainsTextを使うことで、画像やファイルなどテキスト以外のデータが入っている場合に、不要な取得処理を避けられます。
テキスト形式を指定して確認することもできます。
C#if (Clipboard.ContainsText(TextDataFormat.UnicodeText))
{
string text = Clipboard.GetText(TextDataFormat.UnicodeText);
textBox1.Text = text;
}
HTML形式のテキストがあるか確認する場合は次のように書きます。
C#if (Clipboard.ContainsText(TextDataFormat.Html))
{
string html = Clipboard.GetText(TextDataFormat.Html);
}
通常のプレーンテキストを扱うだけなら、引数なしのContainsText()とGetText()で十分です。
3-3. クリップボードが空の場合の戻り値と例外対策
クリップボードが空、またはテキスト以外のデータが入っている場合、Clipboard.GetText()は空文字列を返すことがあります。
C#string text = Clipboard.GetText();
if (string.IsNullOrEmpty(text))
{
MessageBox.Show("取得できる文字列がありません。");
}
ただし、クリップボード操作では、空であること以外にも例外が発生する可能性があります。
たとえば、他のアプリがクリップボードを使用しているタイミングで取得しようとすると、ExternalExceptionが発生する場合があります。
実用的には、次のようにtry-catchを使います。
C#try
{
if (Clipboard.ContainsText())
{
string text = Clipboard.GetText();
textBox1.Text = text;
}
else
{
MessageBox.Show("クリップボードにテキストがありません。");
}
}
catch (System.Runtime.InteropServices.ExternalException)
{
MessageBox.Show("クリップボードを取得できませんでした。少し待ってから再試行してください。");
}
catch (Exception ex)
{
MessageBox.Show("エラーが発生しました: " + ex.Message);
}
特にコピー・貼り付け機能をユーザー操作に組み込む場合は、例外処理を入れておくとアプリが落ちにくくなります。
3-4. 取得した文字列をTextBoxや変数に代入するサンプル
取得した文字列をTextBoxへ代入するサンプルです。
C#private void buttonPaste_Click(object sender, EventArgs e)
{
if (Clipboard.ContainsText())
{
textBox1.Text = Clipboard.GetText();
}
}
既存のTextBoxの末尾へ追加する場合は、次のように書きます。
C#private void buttonAppendPaste_Click(object sender, EventArgs e)
{
if (Clipboard.ContainsText())
{
textBox1.AppendText(Clipboard.GetText());
}
}
変数に代入して加工することもできます。
C#private void buttonRead_Click(object sender, EventArgs e)
{
if (Clipboard.ContainsText())
{
string text = Clipboard.GetText();
string trimmed = text.Trim();
MessageBox.Show("取得した文字列: " + trimmed);
}
}
改行で分割する例です。
C#private void buttonSplit_Click(object sender, EventArgs e)
{
if (Clipboard.ContainsText())
{
string text = Clipboard.GetText();
string[] lines = text.Split(
new[] { Environment.NewLine },
StringSplitOptions.None
);
foreach (string line in lines)
{
Console.WriteLine(line);
}
}
}
このように、GetTextで取得した文字列は通常のstringとして扱えるため、加工、検証、保存、画面表示などに利用できます。
4. クリップボードの内容を削除・上書きする方法
C#では、クリップボードの内容を削除したり、別の文字列で上書きしたりできます。
削除する場合はClipboard.Clear()、上書きする場合はClipboard.SetText()を使います。
C#Clipboard.Clear();
Clipboard.SetText("新しい内容");
ただし、削除や上書きもクリップボードへのアクセスを伴うため、他のアプリが使用中の場合は例外が発生する可能性があります。
4-1. Clipboard.Clearでクリップボードを空にする方法
クリップボードを空にするには、Clipboard.Clear()を使います。
C#Clipboard.Clear();
WinFormsのボタンクリックで削除する例です。
C#private void buttonClear_Click(object sender, EventArgs e)
{
try
{
Clipboard.Clear();
MessageBox.Show("クリップボードを空にしました。");
}
catch (Exception ex)
{
MessageBox.Show("クリップボードを空にできませんでした: " + ex.Message);
}
}
クリップボードを削除したあとにテキストが残っているか確認するには、ContainsTextを使います。
C#Clipboard.Clear();
if (!Clipboard.ContainsText())
{
MessageBox.Show("テキストはありません。");
}
注意点として、クリップボードはOS全体で共有される領域です。自分のアプリだけでなく、他のアプリでコピーした内容も削除してしまいます。
そのため、ユーザーが意図しないタイミングでClipboard.Clear()を実行しないようにしましょう。
4-2. SetTextで既存の内容を上書きする仕組み
Clipboard.SetTextを実行すると、既存のクリップボード内容は新しい文字列で上書きされます。
C#Clipboard.SetText("最初の文字列");
Clipboard.SetText("上書き後の文字列");
この場合、クリップボードに残るのは"上書き後の文字列"です。
確認コードは次のとおりです。
C#Clipboard.SetText("A");
Clipboard.SetText("B");
string text = Clipboard.GetText(); // B
画像やファイル一覧など、テキスト以外の内容が入っていた場合でも、SetTextでテキストを設定すれば、基本的にはテキストデータとして上書きされます。
上書き前に確認したい場合は、次のように書けます。
C#if (Clipboard.ContainsText())
{
string oldText = Clipboard.GetText();
Console.WriteLine("上書き前: " + oldText);
}
Clipboard.SetText("新しい文字列");
4-3. アプリ終了後もクリップボードに内容を残す場合の考え方
通常、Clipboard.SetTextでコピーした内容は、アプリ終了後もクリップボードに残ります。
たとえば、アプリで文字列をコピーしてからアプリを閉じても、メモ帳などに貼り付けできることが一般的です。
C#Clipboard.SetText("アプリ終了後も貼り付けたい文字列");
ただし、クリップボードに残る内容は、ユーザーや他のアプリが新しくコピーすると上書きされます。
また、データ形式や設定方法によっては、アプリ終了後の扱いに注意が必要なケースもあります。単純な文字列であればSetTextで問題ないことが多いですが、複数形式や遅延レンダリングのような高度な使い方をする場合は、アプリ終了後にデータが利用できる形で設定する必要があります。
WinFormsでSetDataObjectを使う場合は、クリップボードにデータを残すかどうかを指定できます。
C#Clipboard.SetDataObject("残したい文字列", true);
第2引数にtrueを指定すると、アプリ終了後もデータを残す意図を示せます。
単純なテキストコピーではSetText、アプリ終了後の保持や複数形式を意識する場合はSetDataObjectを検討するとよいでしょう。
4-4. クリップボード削除時に起きやすいエラーと対処法
Clipboard.Clear()を実行したときに、他のアプリがクリップボードを使用中だと失敗することがあります。
代表的な対策は、try-catchで例外を捕捉することです。
C#try
{
Clipboard.Clear();
}
catch (System.Runtime.InteropServices.ExternalException)
{
MessageBox.Show("クリップボードが使用中のため、削除できませんでした。");
}
少し待って再試行する方法もあります。
C#using System;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Forms;
private void ClearClipboardWithRetry()
{
const int retryCount = 5;
for (int i = 0; i < retryCount; i++)
{
try
{
Clipboard.Clear();
return;
}
catch (ExternalException)
{
Thread.Sleep(100);
}
}
MessageBox.Show("クリップボードを削除できませんでした。");
}
削除時のエラーは、アプリ側のロジックが間違っているというより、一時的にクリップボードへアクセスできないことが原因で発生する場合があります。
そのため、ユーザーに再試行を促す、短時間待ってリトライする、アプリを落とさないように例外処理する、という実装が現実的です。
5. テキスト以外の形式をクリップボードにコピー・取得する方法
クリップボードでは、プレーンテキスト以外にも、Unicodeテキスト、HTML、RTF、画像、ファイル一覧などを扱えます。
通常の文字列コピーであればSetTextで十分ですが、形式を指定したい場合はTextDataFormatやSetDataObjectを使います。
5-1. TextDataFormatを指定してUnicodeText・Html・Rtfを扱う
Clipboard.SetTextには、テキスト形式を指定できるオーバーロードがあります。
C#Clipboard.SetText("テキスト", TextDataFormat.UnicodeText);
代表的なTextDataFormatには次のようなものがあります。
| 形式 | 説明 |
|---|---|
Text | 通常のテキスト |
UnicodeText | Unicodeテキスト |
Html | HTML形式 |
Rtf | RTF形式 |
CommaSeparatedValue | CSV形式 |
Unicodeテキストとしてコピーする例です。
C#Clipboard.SetText("日本語の文字列", TextDataFormat.UnicodeText);
取得する場合も形式を指定できます。
C#if (Clipboard.ContainsText(TextDataFormat.UnicodeText))
{
string text = Clipboard.GetText(TextDataFormat.UnicodeText);
}
RTF形式を扱う例です。
C#string rtf = @"{\rtf1\ansi\b 太字のテキスト\b0}";
Clipboard.SetText(rtf, TextDataFormat.Rtf);
取得する場合は次のように書きます。
C#if (Clipboard.ContainsText(TextDataFormat.Rtf))
{
string rtf = Clipboard.GetText(TextDataFormat.Rtf);
}
HTML形式を扱う場合は、HTMLクリップボード形式に沿った文字列が必要になる場合があります。単純なHTML文字列をそのまま貼り付け先が期待どおりに解釈しないこともあるため、貼り付け先アプリの仕様も確認しましょう。
5-2. SetDataObjectで複数形式のデータをコピーする方法
SetDataObjectを使うと、より柔軟にクリップボードへデータを設定できます。
単純な文字列を設定する例です。
C#Clipboard.SetDataObject("SetDataObjectでコピー", true);
複数形式を設定したい場合は、DataObjectを使います。
C#DataObject data = new DataObject();
data.SetText("プレーンテキスト", TextDataFormat.UnicodeText);
data.SetText(@"{\rtf1\ansi RTFテキスト}", TextDataFormat.Rtf);
Clipboard.SetDataObject(data, true);
このようにしておくと、貼り付け先のアプリが対応している形式を選んで利用できます。
たとえば、リッチテキストに対応したアプリではRTF形式、通常のテキスト入力欄ではプレーンテキストが使われる、といった動きが期待できます。
取得側では、GetDataObjectを使って形式を確認できます。
C#IDataObject data = Clipboard.GetDataObject();
if (data != null && data.GetDataPresent(DataFormats.Text))
{
string text = data.GetData(DataFormats.Text) as string;
}
WinFormsで柔軟なクリップボード操作をしたい場合は、SetDataObjectとDataObjectを覚えておくと便利です。
5-3. 画像・ファイルパスをクリップボードに入れる場合の考え方
クリップボードには画像も設定できます。
WinFormsで画像をコピーする例です。
C#using System.Drawing;
using System.Windows.Forms;
Bitmap bitmap = new Bitmap("sample.png");
Clipboard.SetImage(bitmap);
画像を取得する場合は、ContainsImageとGetImageを使います。
C#if (Clipboard.ContainsImage())
{
Image image = Clipboard.GetImage();
pictureBox1.Image = image;
}
ファイルパスをクリップボードに入れる場合は、単純に文字列としてコピーする方法と、ファイルドロップ形式としてコピーする方法があります。
単純にパス文字列をコピーする場合です。
C#string path = @"C:\Temp\sample.txt";
Clipboard.SetText(path);
エクスプローラーなどでファイルとして貼り付けたい場合は、StringCollectionを使ってファイル一覧として設定します。
C#using System.Collections.Specialized;
using System.Windows.Forms;
StringCollection files = new StringCollection();
files.Add(@"C:\Temp\sample.txt");
Clipboard.SetFileDropList(files);
取得する場合は次のように書きます。
C#if (Clipboard.ContainsFileDropList())
{
StringCollection files = Clipboard.GetFileDropList();
foreach (string file in files)
{
Console.WriteLine(file);
}
}
「パス文字列として貼り付けたい」のか、「ファイルそのものとして貼り付けたい」のかによって、使うメソッドを分けることが重要です。
5-4. SetTextとSetDataObjectの使い分け
SetTextとSetDataObjectの使い分けは、次のように考えると分かりやすいです。
| 目的 | おすすめ |
|---|---|
| 文字列だけをコピーしたい | SetText |
| TextBoxの内容をコピーしたい | SetText |
| 複数形式を同時に入れたい | SetDataObject |
| アプリ終了後の保持を意識したい | SetDataObject |
| HTMLやRTFなどを柔軟に扱いたい | SetDataObject |
| 画像をコピーしたい | SetImage |
| ファイル一覧をコピーしたい | SetFileDropList |
通常の業務アプリやツールで「文字列をコピーする」だけなら、まずはSetTextで十分です。
C#Clipboard.SetText("コピーする文字列");
一方で、コピーしたデータをWord、Excel、メールソフトなどに貼り付けたときに装飾付きで表示したい場合は、RTFやHTMLなど複数形式を設定できるSetDataObjectが向いています。
C#DataObject data = new DataObject();
data.SetText("通常テキスト", TextDataFormat.UnicodeText);
data.SetText(@"{\rtf1\ansi RTFテキスト}", TextDataFormat.Rtf);
Clipboard.SetDataObject(data, true);
まずはSetTextで実装し、要件が増えたらSetDataObjectへ拡張する流れが実用的です。
6. C#のClipboard操作でよくあるエラーと原因
C#のクリップボード操作でよくあるエラーは、主に次の3つです。
STAスレッドではない
他のアプリがクリップボードを使用中
SetTextにnullや空文字列を渡している
特にコンソールアプリや非同期処理では、STAスレッドの問題が起きやすいため注意が必要です。
6-1. 「現在のスレッドはSTAモードである必要があります」の原因
Clipboardを操作するときに、次のようなエラーが出ることがあります。
現在のスレッドはSTAモードである必要があります。
これは、Clipboard操作を実行しているスレッドがSTAではないことが原因です。
WindowsのクリップボードやCOM関連の一部機能は、STAスレッドで動作することを前提としています。
コンソールアプリで次のように書くと、環境によってはエラーになります。
C#using System.Windows.Forms;
internal class Program
{
static void Main()
{
Clipboard.SetText("コピー");
}
}
対策は、Mainメソッドに[STAThread]を付けることです。
C#using System;
using System.Windows.Forms;
internal class Program
{
[STAThread]
static void Main()
{
Clipboard.SetText("コピー");
}
}
WinFormsやWPFのテンプレートでは、通常Mainに[STAThread]が付いています。コンソールアプリでClipboardを使う場合は、特に忘れないようにしましょう。
6-2. [STAThread]属性を付けてThreadStateExceptionを解消する方法
ThreadStateExceptionが発生する場合、まずMainメソッドに[STAThread]が付いているか確認します。
正しい例です。
C#using System;
using System.Windows.Forms;
internal class Program
{
[STAThread]
static void Main(string[] args)
{
Clipboard.SetText("STAThreadを設定しました。");
Console.WriteLine("コピー完了");
}
}
[STAThread]は、プログラムのエントリーポイントであるMainメソッドに付けます。
間違った例です。
C#[STAThread]
public void Copy()
{
Clipboard.SetText("コピー");
}
このように通常のメソッドに付けても、実際に実行しているスレッドがSTAでなければ意味がありません。
別スレッドでClipboardを操作する場合は、そのスレッドをSTAに設定する必要があります。
C#using System.Threading;
using System.Windows.Forms;
Thread thread = new Thread(() =>
{
Clipboard.SetText("別スレッドからコピー");
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
thread.Join();
ただし、WinFormsやWPFでは、基本的にUIスレッドからClipboardを操作するほうが安全です。
6-3. 「OpenClipboardに失敗しました」が発生する原因
OpenClipboardに失敗しましたというエラーは、クリップボードを開こうとしたときに失敗した場合に発生します。
主な原因は、他のアプリケーションがクリップボードを一時的に使用していることです。
たとえば、次のような状況で発生することがあります。
別アプリがコピー処理を実行している
リモートデスクトップや仮想環境でクリップボード同期が動いている
クリップボード監視ツールが動作している
連続でClipboard操作を実行している
大きなデータをコピーしている
このエラーは一時的なことが多いため、少し待って再実行すると成功する場合があります。
基本的な対策は、try-catchでExternalExceptionを捕捉することです。
C#try
{
Clipboard.SetText("コピーする文字列");
}
catch (System.Runtime.InteropServices.ExternalException)
{
MessageBox.Show("クリップボードを開けませんでした。少し待ってから再試行してください。");
}
より安定させたい場合は、短い待機を挟んでリトライします。
6-4. 他アプリがクリップボードを使用中の場合のExternalException対策
他アプリがクリップボードを使用中の場合、ExternalExceptionが発生することがあります。
対策として、次のようなリトライ処理を用意します。
C#using System;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Forms;
private bool TrySetClipboardText(string text)
{
if (string.IsNullOrEmpty(text))
{
return false;
}
for (int i = 0; i < 5; i++)
{
try
{
Clipboard.SetText(text);
return true;
}
catch (ExternalException)
{
Thread.Sleep(100);
}
}
return false;
}
使い方は次のとおりです。
C#private void buttonCopy_Click(object sender, EventArgs e)
{
bool success = TrySetClipboardText(textBox1.Text);
if (success)
{
MessageBox.Show("コピーしました。");
}
else
{
MessageBox.Show("コピーに失敗しました。");
}
}
取得処理も同じようにリトライできます。
C#private string TryGetClipboardText()
{
for (int i = 0; i < 5; i++)
{
try
{
if (Clipboard.ContainsText())
{
return Clipboard.GetText();
}
return string.Empty;
}
catch (ExternalException)
{
Thread.Sleep(100);
}
}
return string.Empty;
}
リトライ間隔は長すぎるとアプリの反応が悪くなります。まずは数十ミリ秒から数百ミリ秒程度で試すとよいでしょう。
6-5. SetTextで空文字列を扱うときの注意点
SetTextに空文字列を渡すと、例外になる場合があります。
C#Clipboard.SetText("");
「空の文字列をコピーしたい」というケースは少なく、多くの場合は「クリップボードを空にしたい」という意図です。その場合はClearを使います。
C#Clipboard.Clear();
ユーザー入力をコピーする場合は、空チェックを入れましょう。
C#string text = textBox1.Text;
if (string.IsNullOrEmpty(text))
{
MessageBox.Show("コピーする文字列がありません。");
return;
}
Clipboard.SetText(text);
空白だけの入力も除外するなら、IsNullOrWhiteSpaceを使います。
C#if (string.IsNullOrWhiteSpace(text))
{
MessageBox.Show("コピーする文字列が空白です。");
return;
}
nullや空文字列の扱いは、Clipboardエラーの中でも見落としやすいポイントです。SetTextの前に入力値をチェックする習慣を付けておくと安全です。
7. クリップボード操作を安定させる実装テクニック
C#でクリップボード操作を安定させるには、次のポイントを押さえることが重要です。
try-catchで例外を捕捉するnullや空文字列を事前に除外する一時的な失敗に備えてリトライする
UIスレッドから操作する
非同期処理や別スレッドではSTAを意識する
単純なサンプルではClipboard.SetTextだけでも動きますが、実際のアプリでは例外対策を入れておくと安心です。
7-1. try-catchで例外を捕捉する基本パターン
まずは、基本のtry-catchです。
C#try
{
Clipboard.SetText("コピーする文字列");
}
catch (Exception ex)
{
MessageBox.Show("コピーに失敗しました: " + ex.Message);
}
より具体的に例外を分ける場合は、次のようにします。
C#try
{
Clipboard.SetText("コピーする文字列");
}
catch (ArgumentNullException)
{
MessageBox.Show("コピーする文字列がnullです。");
}
catch (System.Runtime.InteropServices.ExternalException)
{
MessageBox.Show("クリップボードが使用中です。");
}
catch (Exception ex)
{
MessageBox.Show("予期しないエラー: " + ex.Message);
}
取得処理でも同じように例外処理を入れます。
C#try
{
if (Clipboard.ContainsText())
{
string text = Clipboard.GetText();
textBox1.Text = text;
}
}
catch (System.Runtime.InteropServices.ExternalException)
{
MessageBox.Show("クリップボードから取得できませんでした。");
}
アプリ全体が終了してしまうのを避けるためにも、ユーザー操作で呼ばれるコピー・貼り付け処理には例外処理を入れておくのがおすすめです。
7-2. SetDataObjectを使ってコピー処理を安定させる方法
WinFormsでは、SetDataObjectを使ってクリップボードへデータを設定できます。
C#Clipboard.SetDataObject("コピーする文字列", true);
第2引数にtrueを指定すると、アプリ終了後もデータを保持する意図を示せます。
SetTextの代わりに、次のようなメソッドを用意しておくこともできます。
C#private void CopyTextByDataObject(string text)
{
if (string.IsNullOrEmpty(text))
{
return;
}
Clipboard.SetDataObject(text, true);
}
複数形式を指定する場合は、DataObjectを使います。
C#private void CopyRichText()
{
DataObject data = new DataObject();
data.SetText("通常のテキスト", TextDataFormat.UnicodeText);
data.SetText(@"{\rtf1\ansi Rich Text}", TextDataFormat.Rtf);
Clipboard.SetDataObject(data, true);
}
単純なテキストコピーではSetTextで問題ありませんが、アプリ終了後の保持や複数形式を扱う場合にはSetDataObjectが便利です。
7-3. リトライ処理・待機処理で一時的な失敗に対応する
クリップボードはOS全体で共有されるため、一時的に使えないことがあります。
そのため、ExternalExceptionが出た場合に少し待って再試行する処理を入れると安定します。
C#using System;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Forms;
private bool CopyWithRetry(string text, int retryCount = 5, int delayMilliseconds = 100)
{
if (string.IsNullOrEmpty(text))
{
return false;
}
for (int i = 0; i < retryCount; i++)
{
try
{
Clipboard.SetText(text);
return true;
}
catch (ExternalException)
{
Thread.Sleep(delayMilliseconds);
}
}
return false;
}
呼び出し側です。
C#private void buttonCopy_Click(object sender, EventArgs e)
{
bool result = CopyWithRetry(textBox1.Text);
MessageBox.Show(result ? "コピーしました。" : "コピーに失敗しました。");
}
取得処理もリトライできます。
C#private bool TryGetTextWithRetry(out string text)
{
text = string.Empty;
for (int i = 0; i < 5; i++)
{
try
{
if (Clipboard.ContainsText())
{
text = Clipboard.GetText();
return true;
}
return false;
}
catch (System.Runtime.InteropServices.ExternalException)
{
Thread.Sleep(100);
}
}
return false;
}
使い方です。
C#if (TryGetTextWithRetry(out string text))
{
textBox1.Text = text;
}
else
{
MessageBox.Show("取得できるテキストがありません。");
}
リトライ処理を入れることで、クリップボード監視ツールや他アプリとの競合による一時的な失敗に対応しやすくなります。
7-4. UIスレッドからClipboardを操作するべき理由
WinFormsやWPFでは、Clipboard操作は基本的にUIスレッドから実行するのがおすすめです。
理由は、UIアプリのメインスレッドがSTAで動作していることが多く、Clipboard操作と相性がよいためです。
WinFormsのボタンクリックイベントは、通常UIスレッドで実行されます。
C#private void buttonCopy_Click(object sender, EventArgs e)
{
Clipboard.SetText(textBox1.Text);
}
WPFでも、ボタンクリックイベントは通常UIスレッドで実行されます。
C#private void ButtonCopy_Click(object sender, RoutedEventArgs e)
{
Clipboard.SetText(textBox1.Text);
}
逆に、バックグラウンドスレッドから直接Clipboardを操作すると、STAではないためエラーになる可能性があります。
C#Task.Run(() =>
{
Clipboard.SetText("コピー"); // エラーの原因になることがある
});
UIアプリでは、バックグラウンド処理で作成した文字列をUIスレッドに戻してからClipboardへコピーする設計が安全です。
7-5. 非同期処理・Task・別スレッドでClipboardを扱うときの注意点
Task.Run内でClipboardを操作する場合は注意が必要です。
次のコードは、MTAスレッドで実行される可能性があり、Clipboard操作に失敗することがあります。
C#await Task.Run(() =>
{
Clipboard.SetText("非同期でコピー");
});
WinFormsで非同期処理後にUIスレッドへ戻ってコピーする例です。
C#private async void buttonCopy_Click(object sender, EventArgs e)
{
string text = await Task.Run(() =>
{
return "バックグラウンドで作成した文字列";
});
Clipboard.SetText(text);
}
await後にUIコンテキストへ戻る通常のWinForms/WPFイベントであれば、Clipboard操作をUIスレッドで実行できます。
別スレッドを明示的に作る場合は、STAに設定します。
C#using System.Threading;
using System.Windows.Forms;
string text = "STAスレッドでコピー";
Thread thread = new Thread(() =>
{
Clipboard.SetText(text);
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
thread.Join();
ただし、UIアプリでは無理に別スレッドを作るより、UIスレッドでClipboard操作を行うほうがシンプルで安全です。
8. 実用的なサンプルコード集
ここからは、実際に使いやすいサンプルコードを紹介します。
WinForms、WPF、コンソールアプリ、それぞれでClipboard.SetTextとClipboard.GetTextを使う例を確認しましょう。
8-1. ボタンクリックでTextBoxの文字列をコピーするWinFormsサンプル
WinFormsでTextBoxの内容をクリップボードへコピーするサンプルです。
C#using System;
using System.Windows.Forms;
namespace ClipboardWinFormsSample
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void buttonCopy_Click(object sender, EventArgs e)
{
string text = textBox1.Text;
if (string.IsNullOrWhiteSpace(text))
{
MessageBox.Show("コピーする文字列を入力してください。");
return;
}
try
{
Clipboard.SetText(text);
MessageBox.Show("コピーしました。");
}
catch (Exception ex)
{
MessageBox.Show("コピーに失敗しました: " + ex.Message);
}
}
}
}
この例では、次の処理を行っています。
TextBoxの文字列を取得
空文字列をチェック
Clipboard.SetTextでコピー例外が発生したらメッセージを表示
実用コードでは、このように空チェックと例外処理を入れておくと安心です。
8-2. クリップボードの内容をTextBoxへ貼り付けるWinFormsサンプル
クリップボードの文字列をTextBoxへ貼り付けるサンプルです。
C#using System;
using System.Windows.Forms;
namespace ClipboardWinFormsSample
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void buttonPaste_Click(object sender, EventArgs e)
{
try
{
if (Clipboard.ContainsText())
{
textBox1.Text = Clipboard.GetText();
}
else
{
MessageBox.Show("クリップボードにテキストがありません。");
}
}
catch (Exception ex)
{
MessageBox.Show("貼り付けに失敗しました: " + ex.Message);
}
}
}
}
既存の文字列に追加したい場合は、AppendTextを使います。
C#private void buttonAppendPaste_Click(object sender, EventArgs e)
{
if (Clipboard.ContainsText())
{
textBox1.AppendText(Clipboard.GetText());
}
}
8-3. WPFでSetText/GetTextを使うサンプル
WPFでTextBoxの内容をコピー・貼り付けする例です。
XAMLの例です。
XML<Window x:Class="ClipboardWpfSample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Clipboard Sample" Height="200" Width="400">
<StackPanel Margin="20">
<TextBox x:Name="TextBoxInput" Height="30" />
<Button Content="コピー" Click="ButtonCopy_Click" Margin="0,10,0,0" />
<Button Content="貼り付け" Click="ButtonPaste_Click" Margin="0,10,0,0" />
</StackPanel>
</Window>
コードビハインドです。
C#using System.Windows;
namespace ClipboardWpfSample
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void ButtonCopy_Click(object sender, RoutedEventArgs e)
{
string text = TextBoxInput.Text;
if (string.IsNullOrWhiteSpace(text))
{
MessageBox.Show("コピーする文字列を入力してください。");
return;
}
Clipboard.SetText(text);
MessageBox.Show("コピーしました。");
}
private void ButtonPaste_Click(object sender, RoutedEventArgs e)
{
if (Clipboard.ContainsText())
{
TextBoxInput.Text = Clipboard.GetText();
}
else
{
MessageBox.Show("クリップボードにテキストがありません。");
}
}
}
}
WPFではSystem.Windows.Clipboardを使います。WinFormsのSystem.Windows.Forms.Clipboardとは名前空間が違う点に注意してください。
8-4. コンソールアプリでClipboardを使うサンプル
コンソールアプリでClipboardを使う場合は、[STAThread]が重要です。
C#using System;
using System.Windows.Forms;
internal class Program
{
[STAThread]
static void Main(string[] args)
{
Console.WriteLine("コピーする文字列を入力してください。");
string input = Console.ReadLine();
if (string.IsNullOrWhiteSpace(input))
{
Console.WriteLine("文字列が空です。");
return;
}
Clipboard.SetText(input);
Console.WriteLine("クリップボードにコピーしました。");
}
}
クリップボードから取得する例です。
C#using System;
using System.Windows.Forms;
internal class Program
{
[STAThread]
static void Main(string[] args)
{
if (Clipboard.ContainsText())
{
string text = Clipboard.GetText();
Console.WriteLine("クリップボードの内容:");
Console.WriteLine(text);
}
else
{
Console.WriteLine("クリップボードにテキストがありません。");
}
}
}
.NET 6以降などでWinFormsのClipboardをコンソールアプリから使う場合は、.csprojにWindows Formsの設定が必要になることがあります。
XML<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0-windows</TargetFramework>
<UseWindowsForms>true</UseWindowsForms>
</PropertyGroup>
</Project>
8-5. エラー対策込みのコピー・取得サンプルコード
最後に、コピーと取得を安全に行うための汎用メソッドを紹介します。
C#using System;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Forms;
public static class ClipboardHelper
{
public static bool TrySetText(string text, int retryCount = 5, int delayMilliseconds = 100)
{
if (string.IsNullOrEmpty(text))
{
return false;
}
for (int i = 0; i < retryCount; i++)
{
try
{
Clipboard.SetText(text);
return true;
}
catch (ExternalException)
{
Thread.Sleep(delayMilliseconds);
}
catch
{
return false;
}
}
return false;
}
public static bool TryGetText(out string text, int retryCount = 5, int delayMilliseconds = 100)
{
text = string.Empty;
for (int i = 0; i < retryCount; i++)
{
try
{
if (!Clipboard.ContainsText())
{
return false;
}
text = Clipboard.GetText();
return true;
}
catch (ExternalException)
{
Thread.Sleep(delayMilliseconds);
}
catch
{
return false;
}
}
return false;
}
public static bool TryClear(int retryCount = 5, int delayMilliseconds = 100)
{
for (int i = 0; i < retryCount; i++)
{
try
{
Clipboard.Clear();
return true;
}
catch (ExternalException)
{
Thread.Sleep(delayMilliseconds);
}
catch
{
return false;
}
}
return false;
}
}
使い方です。
C#private void buttonCopy_Click(object sender, EventArgs e)
{
if (ClipboardHelper.TrySetText(textBox1.Text))
{
MessageBox.Show("コピーしました。");
}
else
{
MessageBox.Show("コピーに失敗しました。");
}
}
取得する場合です。
C#private void buttonPaste_Click(object sender, EventArgs e)
{
if (ClipboardHelper.TryGetText(out string text))
{
textBox1.Text = text;
}
else
{
MessageBox.Show("取得できるテキストがありません。");
}
}
削除する場合です。
C#private void buttonClear_Click(object sender, EventArgs e)
{
if (ClipboardHelper.TryClear())
{
MessageBox.Show("クリップボードを空にしました。");
}
else
{
MessageBox.Show("クリップボードを空にできませんでした。");
}
}
このようなヘルパークラスを用意しておくと、複数画面で同じエラー対策を使い回せます。
9. C#のクリップボード操作に関するよくある質問
C#でクリップボードを扱うときによくある疑問をまとめます。
特に、SetTextとSetDataObjectの違い、アプリ終了後に内容が残るか、コンソールアプリで動かない理由、macOSやLinuxで使えるか、といった点はつまずきやすいポイントです。
9-1. Clipboard.SetTextとClipboard.SetDataObjectはどちらを使うべき?
文字列だけをコピーするなら、基本的にはClipboard.SetTextで十分です。
C#Clipboard.SetText("コピーする文字列");
TextBoxの内容、URL、ID、メッセージ文など、単純なテキストをコピーする用途であればSetTextが最も簡単です。
一方で、次のような場合はSetDataObjectを検討します。
複数形式のデータを同時に設定したい
RTFやHTMLなどを貼り付け先に応じて使い分けたい
アプリ終了後もデータを残す指定をしたい
独自形式のデータを扱いたい
例です。
C#Clipboard.SetDataObject("コピーする文字列", true);
結論として、通常はSetText、高度な制御が必要ならSetDataObjectを使うと考えるとよいでしょう。
9-2. クリップボードの内容はアプリ終了後も残る?
通常、Clipboard.SetTextでコピーした文字列は、アプリを終了してもクリップボードに残ります。
C#Clipboard.SetText("アプリ終了後も残る文字列");
ただし、次にユーザーが別の内容をコピーすると上書きされます。また、データ形式や設定方法によっては、アプリ終了後の保持を意識する必要があります。
WinFormsで明示的に残したい場合は、SetDataObjectの第2引数にtrueを指定できます。
C#Clipboard.SetDataObject("残したい文字列", true);
単純な文字列コピーであれば、SetTextでもアプリ終了後に貼り付けできることが一般的です。
9-3. コンソールアプリでClipboardが使えないのはなぜ?
コンソールアプリでClipboardが使えない主な原因は、次のどれかです。
[STAThread]が付いていないWindows Formsの参照やプロジェクト設定が不足している
Windows以外の環境で実行している
別スレッドやTask内で実行している
まず確認すべきは、Mainメソッドの[STAThread]です。
C#[STAThread]
static void Main()
{
Clipboard.SetText("コピー");
}
次に、.csprojでWindows向けの設定がされているか確認します。
XML<TargetFramework>net8.0-windows</TargetFramework>
<UseWindowsForms>true</UseWindowsForms>
.NETのバージョンやプロジェクト形式によっては、System.Windows.Formsを使うための設定が必要です。
9-4. クリップボードにコピーしたのに貼り付けできない原因は?
コピーしたのに貼り付けできない場合、次の原因が考えられます。
SetTextが例外で失敗しているコピーする文字列が空だった
コピー直後に別の処理がクリップボードを上書きしている
貼り付け先アプリがその形式に対応していない
Clipboard操作を別スレッドで行って失敗している
他アプリがクリップボードを使用中だった
まずは、コピー直後にGetTextで取得して確認します。
C#Clipboard.SetText("確認用テキスト");
if (Clipboard.ContainsText())
{
MessageBox.Show(Clipboard.GetText());
}
例外を握りつぶしていると、実際にはコピーに失敗しているのに気づけません。try-catchでエラー内容を確認しましょう。
C#try
{
Clipboard.SetText("コピーする文字列");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
また、HTMLやRTFなど特殊な形式を使っている場合は、貼り付け先アプリがその形式に対応しているかも確認してください。
9-5. macOSやLinuxでも同じコードでクリップボード操作できる?
System.Windows.Forms.ClipboardやSystem.Windows.Clipboardは、基本的にWindowsデスクトップアプリ向けの機能です。
そのため、macOSやLinuxで同じコードをそのまま動かすことはできません。
C#Clipboard.SetText("コピー");
このようなWindows FormsやWPFのClipboardコードは、Windows環境を前提に考える必要があります。
クロスプラットフォームでクリップボードを扱いたい場合は、使用しているUIフレームワークに応じた方法を検討します。
たとえば、次のような選択肢があります。
Avalonia UIのクリップボード機能を使う
MAUIのClipboard APIを使う
OS別のコマンドやネイティブAPIを呼び出す
クロスプラットフォーム対応のライブラリを使う
Windows専用のWinFormsやWPFアプリであれば、この記事で紹介したClipboard.SetTextやClipboard.GetTextを使う方法が基本です。一方で、macOSやLinuxにも対応したい場合は、最初からクロスプラットフォーム対応のUIフレームワークを選ぶと実装しやすくなります。
まとめ
C#でクリップボードに文字列をコピーするには、Clipboard.SetTextを使います。
C#Clipboard.SetText("コピーする文字列");
クリップボードから文字列を取得するには、Clipboard.GetTextを使います。
C#string text = Clipboard.GetText();
実用的には、取得前にContainsTextで確認すると安全です。
C#if (Clipboard.ContainsText())
{
string text = Clipboard.GetText();
}
クリップボードを空にしたい場合は、SetText("")ではなくClipboard.Clear()を使います。
C#Clipboard.Clear();
C#のClipboard操作で特に注意すべきポイントは、次のとおりです。
WinFormsでは
System.Windows.Forms.Clipboardを使うWPFでは
System.Windows.Clipboardを使うコンソールアプリでは
[STAThread]を付けるSetTextにnullや空文字列を渡さない他アプリが使用中の場合に備えて例外処理を入れる
非同期処理や別スレッドではSTAとUIスレッドを意識する
単純なコピー・取得ならSetTextとGetTextで十分です。より安定した実装にしたい場合は、try-catch、リトライ処理、SetDataObjectを組み合わせるとよいでしょう。

