Udostępnij przez


Jak dodać dane do Schowka

Klasa Clipboard udostępnia metody, które współdziałają z funkcją Schowka systemu operacyjnego Windows. Wiele aplikacji używa Schowka jako tymczasowego repozytorium danych. Na przykład edytory tekstu używają Schowka podczas operacji wycinania i wklejania. Schowek przenosi również dane z jednej aplikacji do drugiej.

Po dodaniu danych do Schowka wskaż format danych, aby inne aplikacje mogły rozpoznać dane, jeśli będą mogły używać tego formatu. Dodaj dane do Schowka w wielu różnych formatach, aby zwiększyć liczbę innych aplikacji, które mogą potencjalnie korzystać z danych.

Format schowka to ciąg, który określa format, aby aplikacja korzystająca z tego formatu mogła pobrać powiązane dane. Klasa DataFormats zawiera wstępnie zdefiniowane nazwy formatów do użycia. Możesz również użyć własnych nazw formatów lub użyć typu obiektu jako jego formatu.

Uwaga / Notatka

Wszystkie aplikacje oparte na systemie Windows współużytkują Schowek. W związku z tym zawartość może ulec zmianie po przełączeniu się do innej aplikacji.

Klasę Clipboard można używać tylko w wątkach ustawionych na tryb jednowątkowy (STA). Aby użyć tej klasy, upewnij się, że metoda Main jest oznaczona atrybutem STAThreadAttribute.

Aby dodać dane do Schowka w jednym lub wielu formatach, użyj metody SetDataObject. Przekaż dowolny obiekt do tej metody. Aby dodać dane w wielu formatach, najpierw dodaj dane do oddzielnego obiektu przeznaczonego do pracy z wieloma formatami. Zazwyczaj dodaj dane do elementu DataObject, ale możesz użyć dowolnego typu, który implementuje interfejs IDataObject.

Aby dodać dane do Schowka w jednym, wspólnym formacie, użyj konkretnej metody dla tego formatu, na przykład SetText dla tekstu.

Ważne

Obiekty niestandardowe muszą być serializowalne w formacie JSON, aby można je było umieścić w Schowku. Użyj nowych metod bezpiecznych pod kątem typu, takich jak SetDataAsJson , które automatycznie obsługują serializacji JSON. Starsza SetData() metoda nie działa już z obiektami niestandardowymi rozpoczynającymi się od platformy .NET 9 z powodu usunięcia elementu BinaryFormatter.

Dodawanie danych w jednym formacie

Użyj metody SetAudio, SetFileDropList, SetImagelub 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

Dodawanie danych w formacie niestandardowym

Użyj metody Clipboard.SetDataAsJson<T>(String, T) z niestandardową nazwą formatu i Twoim obiektem.

Metoda SetDataAsJson<T>() automatycznie serializuje obiekty niestandardowe przy użyciu System.Text.Json. Jest to zalecane podejście w .NET 10 i nowszych do przechowywania typów niestandardowych w schowku, ponieważ zapewnia bezpieczeństwo typów danych i korzyści bezpieczeństwa w porównaniu z wcześniejszą metodą SetData().

Ważne

Metoda SetData w starszej wersji nie działa już z obiektami niestandardowymi na platformie .NET 9 i nowszych wersjach z powodu usunięcia komponentu BinaryFormatter. Zamiast tego należy używać SetDataAsJson<T>() w przypadku typów niestandardowych.

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

Klasa Customer używana w poprzednim fragmencie kodu:

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

Dodawanie danych w wielu formatach

Użyj metody Clipboard.SetDataObject i przekaż obiekt DataObject zawierający twoje dane.

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

Klasa Customer używana w poprzednim fragmencie kodu:

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

Zobacz także