Freigeben über


So rufen Sie Daten aus der Zwischenablage ab

Die Clipboard-Klasse bietet Methoden, mit denen Sie mit dem Zwischenablage-Feature des Windows-Betriebssystems interagieren können. 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 ist auch nützlich, um Informationen von einer Anwendung in eine andere zu übertragen.

Hinweis

Alle Windows-basierten Anwendungen teilen die Zwischenablage. 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.

Einige Anwendungen speichern Daten in der Zwischenablage in mehreren Formaten, um die Anzahl anderer Anwendungen zu erhöhen, die die Daten potenziell verwenden können. Ein Zwischenablageformat ist eine Zeichenfolge, die das Format identifiziert. Eine Anwendung, die das identifizierte Format verwendet, kann die verknüpften Daten in der Zwischenablage abrufen. 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. Informationen zum Hinzufügen von Daten zur Zwischenablage finden Sie unter Hinzufügen von Daten zur Zwischenablage.

Um zu ermitteln, ob die Zwischenablage Daten in einem bestimmten Format enthält, verwenden Sie eine der ContainsFormat-Methoden . Verwenden Sie zum Abrufen von Daten aus der Zwischenablage eine der GetFormat-Methoden oder die TryGetData Methode für benutzerdefinierte Formate.

Hinweis

In .NET Framework verwenden Sie die GetData Methode anstelle von TryGetData, und die GetDataObject Methode wird häufig für mehrere Formatszenarien verwendet.

Abrufen in einem einzigen Format

Verwenden Sie die Methode GetAudioStream, GetFileDropList, GetImageoder GetText. Verwenden Sie optional zuerst die entsprechenden ContainsFormatmethoden , um zu bestimmen, ob Daten in einem bestimmten Format verfügbar sind.

Verwenden Sie für benutzerdefinierte Datenformate die TryGetData Methode anstelle der veralteten GetData Methode. Die GetData-Methode gibt Daten in den meisten Fällen erfolgreich zurück, aber wenn BinaryFormatter für die Deserialisierung erforderlich und nicht aktiviert ist, wird eine NotSupportedException-Instanz zurückgegeben, die angibt, dass BinaryFormatter erforderlich ist. Für benutzerdefinierte Datenformate wird empfohlen, die JSON-basierten Methoden (SetDataAsJson<T>() und TryGetData<T>()) für eine bessere Typsicherheit zu verwenden und Abhängigkeiten zu vermeiden BinaryFormatter .

Hinweis

In .NET Framework sind dieselben GetFormatmethoden verfügbar, aber für benutzerdefinierte Formate verwenden Sie GetData anstelle von TryGetData.

// Demonstrates TryGetData methods for common formats.
// These methods are preferred over the older Get* methods.
public Stream? SwapClipboardAudio(Stream replacementAudioStream)
{
    Stream? returnAudioStream = null;
    if (Clipboard.ContainsAudio())
    {
        returnAudioStream = Clipboard.GetAudioStream();
        Clipboard.SetAudio(replacementAudioStream);
    }
    return returnAudioStream;
}

// Demonstrates TryGetData for file drop lists
public StringCollection? SwapClipboardFileDropList(StringCollection replacementList)
{
    StringCollection? returnList = null;
    if (Clipboard.ContainsFileDropList())
    {
        returnList = Clipboard.GetFileDropList();
        Clipboard.SetFileDropList(replacementList);
    }
    return returnList;
}

// Demonstrates TryGetData for images
public Image? SwapClipboardImage(Image replacementImage)
{
    Image? returnImage = null;
    if (Clipboard.ContainsImage())
    {
        returnImage = Clipboard.GetImage();
        Clipboard.SetImage(replacementImage);
    }
    return returnImage;
}

// Demonstrates TryGetData for text in HTML format
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;
}

// Example of using TryGetData for custom string-based data
public string? GetCustomStringData(string format)
{
    if (Clipboard.TryGetData(format, out object? data))
    {
        return data as string;
    }
    return null;
}
' Demonstrates TryGetData methods for common formats.
' These methods are preferred over the older Get* methods.
Public Function SwapClipboardAudio(ByVal replacementAudioStream As System.IO.Stream) As System.IO.Stream

    Dim returnAudioStream As System.IO.Stream = Nothing

    If Clipboard.ContainsAudio() Then
        returnAudioStream = Clipboard.GetAudioStream()
        Clipboard.SetAudio(replacementAudioStream)
    End If

    Return returnAudioStream

End Function

' Demonstrates TryGetData for file drop lists
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 TryGetData for images
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 TryGetData for text in HTML format
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

' Example of using TryGetData for custom string-based data
Public Function GetCustomStringData(ByVal format As String) As String

    Dim data As Object = Nothing
    If Clipboard.TryGetData(format, data) Then
        Return TryCast(data, String)
    End If

    Return Nothing

End Function

Abrufen im benutzerdefinierten Format

Verwenden Sie die TryGetData-Methode mit einem benutzerdefinierten Formatnamen. Diese Methode ersetzt die veraltete GetData Methode in modernen .NET-Versionen.

Sie können auch vordefinierte Formatnamen mit dieser Methode verwenden. Weitere Informationen finden Sie unter DataFormats.

Von Bedeutung

In .NET 10 und höher funktioniert SetData nicht mehr mit Typen, die BinaryFormatter für die Serialisierung erforderlich sind. Die GetData Methode, die in den meisten Fällen erfolgreich Daten zurückgibt, gibt jedoch eine NotSupportedException Instanz zurück, die angibt, dass BinaryFormatter erforderlich ist, wenn BinaryFormatter für die Deserialisierung erforderlich und nicht aktiviert ist. Die folgenden Beispiele zeigen, wie Daten abgerufen werden, die möglicherweise von anderen Anwendungen oder früheren .NET-Versionen festgelegt wurden.

Hinweis

In .NET Framework wird die GetData-Methode anstelle von TryGetData verwendet, und die Objektserialisierung über SetData wird vollständig unterstützt.

// Demonstrates TryGetData using a custom format name and a business object.
// Note: In .NET 10, SetData for objects is no longer supported,
// so this example shows how to retrieve data that might have been
// set by other applications or earlier .NET versions.
public Customer? TestCustomFormat
{
    get
    {
        // For demonstration, we'll use string data instead of objects
        // since SetData for objects is no longer supported in .NET 10
        if (Clipboard.TryGetData("CustomerFormat", out object? data))
        {
            return data as Customer;
        }
        return null;
    }
}
' Demonstrates TryGetData using a custom format name and a business object.
' Note: In .NET 10, SetData for objects is no longer supported,
' so this example shows how to retrieve data that might have been
' set by other applications or earlier .NET versions.
Public ReadOnly Property TestCustomFormat() As Customer
    Get
        Dim data As Object = Nothing
        ' For demonstration, we'll use string data instead of objects
        ' since SetData for objects is no longer supported in .NET 10
        If Clipboard.TryGetData("CustomerFormat", data) Then
            Return TryCast(data, Customer)
        End If
        Return Nothing
    End Get
End Property

Die Customer im vorherigen Codeausschnitt verwendete Klasse:

[Serializable]
public class Customer
{
    private string nameValue = string.Empty;
    public Customer(string name)
    {
        nameValue = name;
    }
    public string Name
    {
        get { return nameValue; }
        set { nameValue = value; }
    }
}
<Serializable()>
Public Class Customer

    Private nameValue As String = String.Empty

    Public Sub New(ByVal name As String)
        nameValue = name
    End Sub

    Public Property Name() As String
        Get
            Return nameValue
        End Get
        Set(ByVal value As String)
            nameValue = value
        End Set
    End Property

End Class

Abrufen in mehreren Formaten

Verwenden Sie die GetDataObject Methode zum Abrufen eines IDataObject, und verwenden Sie TryGetData dann zum Abrufen von Daten in bestimmten Formaten.

Dieser Ansatz wird für moderne .NET-Anwendungen empfohlen, da sie die neueren, sichereren APIs verwendet.

Hinweis

In .NET Framework verwenden Sie in der Regel die GetDataObject-Methode und arbeiten direkt mit der zurückgegebenen IDataObject, indem Sie dessen Methoden wie GetData anstatt des neueren TryGetData-Ansatzes verwenden.

// Demonstrates how to retrieve data from the Clipboard in multiple formats
// using TryGetData instead of the obsoleted GetData method.
public void TestClipboardMultipleFormats()
{
    IDataObject? dataObject = Clipboard.GetDataObject();
    
    if (dataObject != null)
    {
        // Check for custom format
        if (dataObject.GetDataPresent("CustomFormat"))
        {
            if (Clipboard.TryGetData("CustomFormat", out object? customData))
            {
                if (customData is ListViewItem item)
                {
                    MessageBox.Show(item.Text);
                }
                else if (customData is string stringData)
                {
                    MessageBox.Show(stringData);
                }
            }
        }

        // Check for Customer type - note that object serialization
        // through SetData is no longer supported in .NET 10
        if (dataObject.GetDataPresent(typeof(Customer)))
        {
            if (Clipboard.TryGetData(typeof(Customer).FullName!, out object? customerData))
            {
                if (customerData is Customer customer)
                {
                    MessageBox.Show(customer.Name);
                }
            }
        }

        // For modern .NET 10 applications, prefer using standard formats
        if (Clipboard.ContainsText())
        {
            string text = Clipboard.GetText();
            MessageBox.Show($"Text data: {text}");
        }
    }
}
' Demonstrates how to retrieve data from the Clipboard in multiple formats
' using TryGetData instead of the obsoleted GetData method.
Public Sub TestClipboardMultipleFormats()

    Dim dataObject As IDataObject = Clipboard.GetDataObject()

    If dataObject IsNot Nothing Then

        ' Check for custom format
        If dataObject.GetDataPresent("CustomFormat") Then

            Dim customData As Object = Nothing
            If Clipboard.TryGetData("CustomFormat", customData) Then

                Dim item As ListViewItem = TryCast(customData, ListViewItem)
                If item IsNot Nothing Then
                    MessageBox.Show(item.Text)
                ElseIf TypeOf customData Is String Then
                    MessageBox.Show(CStr(customData))
                End If

            End If

        End If

        ' Check for Customer type - note that object serialization
        ' through SetData is no longer supported in .NET 10
        If dataObject.GetDataPresent(GetType(Customer)) Then

            Dim customerData As Object = Nothing
            If Clipboard.TryGetData(GetType(Customer).FullName, customerData) Then

                Dim customer As Customer = TryCast(customerData, Customer)
                If customer IsNot Nothing Then
                    MessageBox.Show(customer.Name)
                End If

            End If

        End If

        ' For modern .NET 10 applications, prefer using standard formats
        If Clipboard.ContainsText() Then
            Dim text As String = Clipboard.GetText()
            MessageBox.Show($"Text data: {text}")
        End If

    End If

End Sub
[Serializable]
public class Customer
{
    private string nameValue = string.Empty;
    public Customer(string name)
    {
        nameValue = name;
    }
    public string Name
    {
        get { return nameValue; }
        set { nameValue = value; }
    }
}
<Serializable()>
Public Class Customer

    Private nameValue As String = String.Empty

    Public Sub New(ByVal name As String)
        nameValue = name
    End Sub

    Public Property Name() As String
        Get
            Return nameValue
        End Get
        Set(ByVal value As String)
            nameValue = value
        End Set
    End Property

End Class

Siehe auch