Freigeben über


Hinzufügen von Daten zur Zwischenablage

Die Clipboard Klasse stellt Methoden bereit, die mit dem Feature "Zwischenablage" des Windows-Betriebssystems interagieren. Viele Anwendungen verwenden die Zwischenablage als temporäres Repository für Daten. Beispielsweise verwenden Textverarbeitungsprogramme die Zwischenablage während des Ausschneidens und Einfügens. Die Zwischenablage überträgt auch Daten von einer Anwendung an eine andere.

Wenn Sie der Zwischenablage Daten hinzufügen, geben Sie das Datenformat an, damit andere Anwendungen die Daten erkennen können, wenn sie dieses Format verwenden können. Fügen Sie der Zwischenablage Daten in mehreren verschiedenen Formaten hinzu, um die Anzahl anderer Anwendungen zu erhöhen, die die Daten potenziell verwenden können.

Ein Zwischenablageformat ist eine Zeichenfolge, die das Format identifiziert, sodass eine Anwendung, die dieses Format verwendet, die zugeordneten Daten abrufen kann. Die DataFormats Klasse stellt vordefinierte Formatnamen für Ihre Verwendung bereit. Sie können auch eigene Formatnamen verwenden oder den Typ eines Objekts als Format verwenden.

Hinweis

Alle Windows-basierten Anwendungen nutzen die Zwischenablage gemeinsam. Daher können sich die Inhalte ändern, wenn Sie zu einer anderen Anwendung wechseln.

Die Clipboard-Klasse kann nur in Threads verwendet werden, die auf den STA-Modus (Single Thread Apartment) festgelegt sind. Um diese Klasse zu verwenden, stellen Sie sicher, dass die Main-Methode mit dem STAThreadAttribute-Attribut markiert ist.

Zum Hinzufügen von Daten zur Zwischenablage in einem oder mehreren Formaten verwenden Sie die SetDataObject-Methode. Übergeben Sie jedes Objekt an diese Methode. Um Daten in mehreren Formaten hinzuzufügen, fügen Sie zuerst die Daten zu einem separaten Objekt hinzu, das für die Arbeit mit mehreren Formaten konzipiert ist. Fügen Sie in der Regel Ihre Daten zu einem DataObject, aber Sie können jeden Typ verwenden, der die IDataObject Schnittstelle implementiert.

Wenn Sie der Zwischenablage Daten in einem einzigen gängigen Format hinzufügen möchten, verwenden Sie die spezifische Methode für dieses Format, z. B. SetText für Text.

Von Bedeutung

Benutzerdefinierte Objekte müssen in JSON serialisierbar sein, damit sie in die Zwischenablage eingefügt werden. Verwenden Sie die neuen typsicheren Methoden wie SetDataAsJson, die JSON-Serialisierung automatisch verarbeiten. Die Legacy-Methode SetData() funktioniert nicht mehr mit benutzerdefinierten Objekten ab .NET 9, da BinaryFormatter entfernt wurde.

Hinzufügen von Daten in einem einzigen Format

Verwenden Sie die Methode SetAudio, SetFileDropList, SetImageoder 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

Hinzufügen von Daten in einem benutzerdefinierten Format

Verwenden Sie die Clipboard.SetDataAsJson<T>(String, T) Methode mit einem benutzerdefinierten Formatnamen und Ihrem Objekt.

Die SetDataAsJson<T>() Methode serialisiert ihre benutzerdefinierten Objekte automatisch mithilfe von System.Text.Json. Dies ist der empfohlene Ansatz in .NET 10 und höher zum Speichern von benutzerdefinierten Typen in der Zwischenablage, da sie Typsicherheits- und Sicherheitsvorteile gegenüber der Legacymethode SetData() bietet.

Von Bedeutung

Die Legacymethode SetData funktioniert in .NET 9 und höher nicht mehr mit benutzerdefinierten Objekten, da BinaryFormatter entfernt wurde. Verwenden Sie SetDataAsJson<T>() stattdessen für benutzerdefinierte Typen.

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

Die Customer im vorherigen Codeausschnitt verwendete Klasse:

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

Hinzufügen von Daten in mehreren Formaten

Verwenden Sie die Clipboard.SetDataObject-Methode, und übergeben Sie ein DataObject an sie, das Ihre Daten enthält.

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

Die Customer im vorherigen Codeausschnitt verwendete Klasse:

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

Siehe auch