该 Clipboard 类提供与 Windows作系统剪贴板功能交互的方法。 许多应用程序使用剪贴板作为数据的临时存储库。 例如,字处理器在剪切和粘贴操作期间使用剪贴板。 剪贴板还会将数据从一个应用程序传输到另一个应用程序。
将数据添加到剪贴板时,指示数据格式,以便其他应用程序可以使用该格式识别数据。 以多种不同的格式将数据添加到剪贴板,以增加可能使用该数据的其他应用程序的数量。
剪贴板格式是标识格式的字符串,以便使用该格式的应用程序可以检索关联的数据。 DataFormats 类提供预定义的格式名称供你使用。 还可以使用自己的格式名称或使用对象的类型作为其格式。
注释
所有基于 Windows 的应用程序共享剪贴板。 因此,切换到另一个应用程序时,内容可能会更改。
Clipboard 类只能在设置为单线程单元 (STA) 模式的线程中使用。 若要使用此类,请确保使用 Main 特性标记 STAThreadAttribute 方法。
若要以一种或多种格式将数据添加到剪贴板,请使用 SetDataObject 该方法。 将任何对象传递给此方法。 若要以多种格式添加数据,请先将数据添加到设计为处理多种格式的单独对象。 通常,您可以将数据添加到 DataObject 中,但也可以使用实现 IDataObject 接口的任何类型。
若要以单一通用格式将数据添加到剪贴板,请使用适用于该格式的具体方法,例如用于文本的 SetText。
重要
自定义对象必须可序列化为 JSON,才能将其放在剪贴板上。 使用新的类型安全方法,例如 SetDataAsJson 自动处理 JSON 序列化。 由于删除SetData(),旧BinaryFormatter方法不再适用于从 .NET 9 开始的自定义对象。
以单一格式添加数据
使用 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 自动序列化自定义对象。 这是 .NET 10 及更高版本中的建议方法,用于在剪贴板上存储自定义类型,因为它提供与旧 SetData() 方法的类型安全性和安全优势。
重要
由于删除BinaryFormatter,旧SetData方法在 .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