Sdílet prostřednictvím


Postup přidání dat do schránky

Třída Clipboard poskytuje metody, které pracují s funkcí Schránka operačního systému Windows. Mnoho aplikací používá schránku jako dočasné úložiště údajů. Například textové procesory používají schránku během operací vystřižení a vložení. Schránka také přenáší data z jedné aplikace do druhé.

Když přidáte data do schránky, označte formát dat, aby ostatní aplikace mohly tato data rozpoznat, pokud mohou tento formát použít. Přidejte data do schránky ve více různých formátech, abyste zvýšili počet dalších aplikací, které můžou data potenciálně používat.

Formát schránky je řetězec, který identifikuje formát, aby aplikace používající tento formát mohla načíst přidružená data. Třída DataFormats poskytuje předdefinované názvy formátů pro vaše použití. Můžete také použít vlastní názvy formátů nebo jako jeho formát použít typ objektu.

Poznámka:

Všechny aplikace na platformě Windows sdílejí schránku. Obsah se proto může změnit, když přepnete do jiné aplikace.

Třída Clipboard lze použít pouze ve vláknech nastavených na režim jednovláknového apartmentu (STA). Chcete-li použít tuto třídu, ujistěte se, že je vaše metoda Main označena atributem STAThreadAttribute.

Chcete-li přidat data do schránky v jednom formátu nebo více formátech, použijte metodu SetDataObject. Předejte do této metody libovolný objekt. Pokud chcete přidat data ve více formátech, nejprve přidejte data do samostatného objektu navrženého pro práci s více formáty. Obvykle přidejte data do objektu DataObject, ale můžete použít libovolný typ, který implementuje IDataObject rozhraní.

Pokud chcete přidat data do schránky v jednom, společném formátu, použijte pro tento formát konkrétní metodu, například SetText pro text.

Důležité

Vlastní objekty musí být serializovány do formátu JSON, aby se daly umístit do schránky. Použijte nové metody bezpečné pro typ, jako je SetDataAsJson, které automaticky zpracovávají serializaci JSON. Zastaralá metoda SetData() již nefunguje s vlastními objekty počínaje verzí .NET 9 z důvodu odebrání BinaryFormatter.

Přidání dat v jednom formátu

Použijte metodu SetAudio, SetFileDropList, SetImagenebo 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

Přidání dat ve vlastním formátu

Použijte metodu Clipboard.SetDataAsJson<T>(String, T) s vlastním názvem formátu a objektem.

Metoda SetDataAsJson<T>() automaticky serializuje vlastní objekty pomocí System.Text.Json. Toto je doporučovaný přístup v .NET 10 a novějších pro ukládání vlastních typů do schránky, protože poskytuje výhody bezpečnosti typů a zabezpečení oproti starší SetData() metodě.

Důležité

Starší metoda SetData již nefunguje s vlastními objekty v .NET 9 a pozdějších verzích kvůli odebrání podpory BinaryFormatter. Místo toho použijte SetDataAsJson<T>() pro vlastní typy.

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

Třída Customer použitá v předchozím fragmentu kódu:

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

Přidání dat ve více formátech

Použijte metodu Clipboard.SetDataObject a předejte DataObject, která obsahuje vaše data.

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

Třída Customer použitá v předchozím fragmentu kódu:

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

Viz také