如何将数据添加到剪贴板

Clipboard 类提供与 Windows作系统剪贴板功能交互的方法。 许多应用程序使用剪贴板作为数据的临时存储库。 例如,字处理器在剪切和粘贴操作期间使用剪贴板。 剪贴板还会将数据从一个应用程序传输到另一个应用程序。

将数据添加到剪贴板时,指示数据格式,以便其他应用程序可以使用该格式识别数据。 以多种不同的格式将数据添加到剪贴板,以增加可能使用该数据的其他应用程序的数量。

剪贴板格式是标识格式的字符串,以便使用该格式的应用程序可以检索关联的数据。 DataFormats 类提供预定义的格式名称供你使用。 还可以使用自己的格式名称或使用对象的类型作为其格式。

注释

所有基于 Windows 的应用程序共享剪贴板。 因此,切换到另一个应用程序时,内容可能会更改。

Clipboard 类只能在设置为单线程单元 (STA) 模式的线程中使用。 若要使用此类,请确保使用 Main 特性标记 STAThreadAttribute 方法。

若要以一种或多种格式将数据添加到剪贴板,请使用 SetDataObject 该方法。 将任何对象传递给此方法。 若要以多种格式添加数据,请先将数据添加到设计为处理多种格式的单独对象。 通常,您可以将数据添加到 DataObject 中,但也可以使用实现 IDataObject 接口的任何类型。

若要以单一通用格式将数据添加到剪贴板,请使用适用于该格式的具体方法,例如用于文本的 SetText

重要

自定义对象必须可序列化为 JSON,才能将其放在剪贴板上。 使用新的类型安全方法,例如 SetDataAsJson 自动处理 JSON 序列化。 由于删除SetData(),旧BinaryFormatter方法不再适用于从 .NET 9 开始的自定义对象。

以单一格式添加数据

使用 SetAudioSetFileDropListSetImageSetText 方法。

// 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

另请参阅