Clipboard クラスは、Windows オペレーティング システムクリップボード機能と対話するメソッドを提供します。 多くのアプリケーションでは、クリップボードをデータの一時リポジトリとして使用します。 たとえば、ワード プロセッサでは、切り取りと貼り付けの操作中にクリップボードが使用されます。 また、クリップボードは、あるアプリケーションから別のアプリケーションにデータを転送します。
クリップボードにデータを追加する場合は、他のアプリケーションがその形式を使用できる場合にデータを認識できるように、データ形式を指定します。 クリップボードに複数の異なる形式でデータを追加して、データを使用できる可能性のある他のアプリケーションの数を増やします。
クリップボード形式は、その形式を使用するアプリケーションが関連付けられているデータを取得できるように、形式を識別する文字列です。 DataFormats クラスには、使用するための定義済みの形式名が用意されています。 独自の形式名を使用したり、オブジェクトの型をその形式として使用したりすることもできます。
注
すべての Windows ベースのアプリケーションがクリップボードを共有します。 そのため、別のアプリケーションに切り替えると内容が変更される場合があります。
Clipboard クラスは、単一スレッド アパートメント (STA) モードに設定されたスレッドでのみ使用できます。 このクラスを使用するには、 Main メソッドが STAThreadAttribute 属性でマークされていることを確認します。
1 つまたは複数の形式でクリップボードにデータを追加するには、 SetDataObject メソッドを使用します。 任意のオブジェクトをこのメソッドに渡します。 複数の形式のデータを追加するには、まず、複数の形式で動作するように設計された別のオブジェクトにデータを追加します。 通常、データを DataObjectに追加しますが、 IDataObject インターフェイスを実装する任意の型を使用できます。
1 つの共通の形式でクリップボードにデータを追加するには、テキストの SetText など、その形式に固有のメソッドを使用します。
Important
カスタム オブジェクトをクリップボードに配置するには、JSON にシリアル化できる必要があります。 JSON シリアル化を自動的に処理する SetDataAsJson などの新しいタイプ セーフメソッドを使用します。 レガシ SetData() メソッドは、 BinaryFormatterの削除により、.NET 9 以降のカスタム オブジェクトでは機能しなくなりました。
1 つの形式でデータを追加する
SetAudio、SetFileDropList、SetImage、またはSetTextメソッドを使用します。
// Demonstrates SetAudio, ContainsAudio, and GetAudioStream.
public Stream SwapClipboardAudio(Stream replacementAudioStream)
{
Stream? returnAudioStream = null;
if (Clipboard.ContainsAudio())
{
returnAudioStream = Clipboard.GetAudioStream();
Clipboard.SetAudio(replacementAudioStream);
}
return returnAudioStream;
}
// Demonstrates SetFileDropList, ContainsFileDroList, and GetFileDropList
public StringCollection SwapClipboardFileDropList(StringCollection replacementList)
{
StringCollection? returnList = null;
if (Clipboard.ContainsFileDropList())
{
returnList = Clipboard.GetFileDropList();
Clipboard.SetFileDropList(replacementList);
}
return returnList;
}
// Demonstrates SetImage, ContainsImage, and GetImage.
public Image SwapClipboardImage(Image replacementImage)
{
Image? returnImage = null;
if (Clipboard.ContainsImage())
{
returnImage = Clipboard.GetImage();
Clipboard.SetImage(replacementImage);
}
return returnImage;
}
// Demonstrates SetText, ContainsText, and GetText.
public string SwapClipboardHtmlText(string replacementHtmlText)
{
string? returnHtmlText = null;
if (Clipboard.ContainsText(TextDataFormat.Html))
{
returnHtmlText = Clipboard.GetText(TextDataFormat.Html);
Clipboard.SetText(replacementHtmlText, TextDataFormat.Html);
}
return returnHtmlText;
}
' Demonstrates SetAudio, ContainsAudio, and GetAudioStream.
Public Function SwapClipboardAudio(
ByVal replacementAudioStream As Stream) As Stream
Dim returnAudioStream As Stream = Nothing
If Clipboard.ContainsAudio() Then
returnAudioStream = Clipboard.GetAudioStream()
Clipboard.SetAudio(replacementAudioStream)
End If
Return returnAudioStream
End Function
' Demonstrates SetFileDropList, ContainsFileDroList, and GetFileDropList
Public Function SwapClipboardFileDropList(ByVal replacementList As StringCollection) As StringCollection
Dim returnList As StringCollection = Nothing
If Clipboard.ContainsFileDropList() Then
returnList = Clipboard.GetFileDropList()
Clipboard.SetFileDropList(replacementList)
End If
Return returnList
End Function
' Demonstrates SetImage, ContainsImage, and GetImage.
Public Function SwapClipboardImage(
ByVal replacementImage As Image) As Image
Dim returnImage As Image = Nothing
If Clipboard.ContainsImage() Then
returnImage = Clipboard.GetImage()
Clipboard.SetImage(replacementImage)
End If
Return returnImage
End Function
' Demonstrates SetText, ContainsText, and GetText.
Public Function SwapClipboardHtmlText(
ByVal replacementHtmlText As String) As String
Dim returnHtmlText As String = Nothing
If Clipboard.ContainsText(TextDataFormat.Html) Then
returnHtmlText = Clipboard.GetText(TextDataFormat.Html)
Clipboard.SetText(replacementHtmlText, TextDataFormat.Html)
End If
Return returnHtmlText
End Function
カスタム形式でデータを追加する
カスタム形式名とオブジェクトで Clipboard.SetDataAsJson<T>(String, T) メソッドを使用します。
SetDataAsJson<T>() メソッドは、System.Text.Jsonを使用してカスタム オブジェクトを自動的にシリアル化します。 これは、従来の SetData() メソッドよりも型の安全性とセキュリティ上の利点があるため、クリップボードにカスタム型を格納するために、.NET 10 以降で推奨されるアプローチです。
Important
レガシ SetData メソッドは、 BinaryFormatterの削除により、.NET 9 以降のカスタム オブジェクトでは機能しなくなりました。 代わりにカスタム型に SetDataAsJson<T>() を使用します。
// Demonstrates SetDataAsJson, ContainsData, and GetData
// using a custom format name and a business object.
public Customer TestCustomFormat
{
get
{
Clipboard.SetDataAsJson("CustomerFormat", new Customer("Customer Name"));
if (Clipboard.ContainsData("CustomerFormat"))
{
if (Clipboard.TryGetData("CustomerFormat", out Customer customerData))
return customerData;
}
return null;
}
}
' Demonstrates SetData, ContainsData, and GetData
' using a custom format name and a business object.
Public ReadOnly Property TestCustomFormat() As Customer
Get
Clipboard.SetDataAsJson("CustomerFormat", New Customer("Customer Name"))
If Clipboard.ContainsData("CustomerFormat") Then
Dim customerData As Customer = Nothing
If Clipboard.TryGetData("CustomerFormat", customerData) Then
Return customerData
End If
End If
Return Nothing
End Get
End Property
前のスニペットで使用した Customer クラス:
// Customer class used in custom clipboard format examples.
public class Customer
{
public string Name { get; set; }
public Customer(string name)
{
Name = name;
}
}
'Customer class used in custom clipboard format examples.
Public Class Customer
Public Property Name As String
Public Sub New(ByVal name As String)
Me.Name = name
End Sub
End Class
複数の形式でデータを追加する
Clipboard.SetDataObject メソッドを使用し、データを含むDataObjectを渡します。
// Demonstrates how to use a DataObject to add
// data to the Clipboard in multiple formats.
public void TestClipboardMultipleFormats()
{
DataObject data = new();
Customer customer = new("Customer #2112");
ListViewItem listViewItem = new($"Customer as ListViewItem {customer.Name}");
// Add a Customer object using the type as the format.
data.SetDataAsJson(customer);
// Add a ListViewItem object using a custom format name.
data.SetDataAsJson("ListViewItemFormat", listViewItem.Text);
Clipboard.SetDataObject(data);
// Retrieve the data from the Clipboard.
DataObject retrievedData = (DataObject)Clipboard.GetDataObject()!;
if (retrievedData.GetDataPresent("ListViewItemFormat"))
{
if (retrievedData.TryGetData("ListViewItemFormat", out String item))
{
ListViewItem recreatedListViewItem = new(item);
MessageBox.Show($"Data contains ListViewItem with text of {recreatedListViewItem.Text}");
}
}
if (retrievedData.GetDataPresent(typeof(Customer)))
{
if (retrievedData.TryGetData(out Customer newCustomer))
{
MessageBox.Show($"Data contains Customer with name of {newCustomer.Name}");
}
}
}
' Demonstrates how to use a DataObject to add
' data to the Clipboard in multiple formats.
Public Sub TestClipboardMultipleFormats()
Dim data As New DataObject()
Dim customer As New Customer("Customer #2112")
Dim listViewItem As New ListViewItem($"Customer as ListViewItem {customer.Name}")
' Add a Customer object using the type as the format.
data.SetDataAsJson(customer)
' Add a ListViewItem object using a custom format name.
data.SetDataAsJson("ListViewItemFormat", listViewItem.Text)
Clipboard.SetDataObject(data)
' Retrieve the data from the Clipboard.
Dim retrievedData As DataObject = CType(Clipboard.GetDataObject(), DataObject)
If retrievedData.GetDataPresent("ListViewItemFormat") Then
Dim item As String = Nothing
If retrievedData.TryGetData("ListViewItemFormat", item) Then
Dim recreatedListViewItem As New ListViewItem(item)
MessageBox.Show($"Data contains ListViewItem with text of {recreatedListViewItem.Text}")
End If
End If
If retrievedData.GetDataPresent(GetType(Customer)) Then
Dim newCustomer As Customer = Nothing
If retrievedData.TryGetData(newCustomer) Then
MessageBox.Show($"Data contains Customer with name of {newCustomer.Name}")
End If
End If
End Sub
前のスニペットで使用した Customer クラス:
// Customer class used in custom clipboard format examples.
public class Customer
{
public string Name { get; set; }
public Customer(string name)
{
Name = name;
}
}
'Customer class used in custom clipboard format examples.
Public Class Customer
Public Property Name As String
Public Sub New(ByVal name As String)
Me.Name = name
End Sub
End Class
こちらも参照ください
.NET Desktop feedback