Compartilhar via


Como adicionar dados à Área de Transferência

A Clipboard classe fornece métodos que interagem com o recurso de área de transferência do sistema operacional Windows. Muitos aplicativos usam a Área de Transferência como um repositório temporário para dados. Por exemplo, processadores globais usam a Área de Transferência durante operações de cortar e colar. A Área de Transferência também transfere dados de uma aplicação para outra.

Ao adicionar dados à Área de Transferência, indique o formato de dados para que outros aplicativos possam reconhecer os dados se puderem usar esse formato. Adicione dados à Área de Transferência em vários formatos diferentes para aumentar o número de outros aplicativos que podem potencialmente usar os dados.

Um formato de área de transferência é uma cadeia de caracteres que identifica o formato, permitindo que um aplicativo que utiliza esse formato recupere os dados associados. A classe DataFormats fornece nomes de formato predefinidos para seu uso. Você também pode usar seus próprios nomes de formato ou usar o tipo de um objeto como seu formato.

Observação

Todos os aplicativos baseados no Windows compartilham a Área de Transferência. Portanto, o conteúdo está sujeito a alterações quando você alterna para outro aplicativo.

A classe Clipboard só pode ser usada em threads configurados no modo STA (Single Thread Apartment). Para usar essa classe, verifique se o método Main está marcado com o atributo STAThreadAttribute.

Para adicionar dados à Área de Transferência em um ou vários formatos, use o método SetDataObject. Passe qualquer objeto para esse método. Para adicionar dados em vários formatos, primeiro adicione os dados a um objeto separado projetado para funcionar com vários formatos. Normalmente, adicione seus dados a um DataObject, mas você pode usar qualquer tipo que implemente a IDataObject interface.

Para adicionar dados à Área de Transferência em um formato único e padrão, use o método específico para esse formato, como SetText para texto.

Importante

Objetos personalizados devem ser serializáveis em JSON para que possam ser colocados na Área de Transferência. Use os novos métodos de tipo seguro, como SetDataAsJson os quais lidam automaticamente com a serialização JSON. O método herdado SetData() não funciona mais com objetos personalizados começando com o .NET 9 devido à remoção de BinaryFormatter.

Adicionar dados em um único formato

Use o método SetAudio, SetFileDropList, SetImageou 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

Adicionar dados em um formato personalizado

Use o Clipboard.SetDataAsJson<T>(String, T) método com um nome de formato personalizado e seu objeto.

O SetDataAsJson<T>() método serializa automaticamente seus objetos personalizados usando System.Text.Json. Essa é a abordagem recomendada no .NET 10 e posteriores para armazenar tipos personalizados na área de transferência, pois fornece vantagens de segurança e de segurança de tipo sobre o método herdado SetData().

Importante

O método herdado SetData não funciona mais com objetos personalizados no .NET 9 e posterior devido à remoção de BinaryFormatter. Use SetDataAsJson<T>() em vez disso para tipos personalizados.

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

A Customer classe usada no snippet anterior:

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

Adicionar dados em vários formatos

Use o Clipboard.SetDataObject método e passe um DataObject que contenha seus dados.

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

A Customer classe usada no snippet anterior:

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

Consulte também