次の方法で共有


クリップボードにデータを追加する方法

Clipboard クラスは、Windows オペレーティング システムクリップボード機能と対話するメソッドを提供します。 多くのアプリケーションでは、クリップボードをデータの一時リポジトリとして使用します。 たとえば、ワード プロセッサでは、切り取りと貼り付けの操作中にクリップボードが使用されます。 また、クリップボードは、あるアプリケーションから別のアプリケーションにデータを転送します。

クリップボードにデータを追加する場合は、他のアプリケーションがその形式を使用できる場合にデータを認識できるように、データ形式を指定します。 クリップボードに複数の異なる形式でデータを追加して、データを使用できる可能性のある他のアプリケーションの数を増やします。

クリップボード形式は、その形式を使用するアプリケーションが関連付けられているデータを取得できるように、形式を識別する文字列です。 DataFormats クラスには、使用するための定義済みの形式名が用意されています。 独自の形式名を使用したり、オブジェクトの型をその形式として使用したりすることもできます。

すべての Windows ベースのアプリケーションがクリップボードを共有します。 そのため、別のアプリケーションに切り替えると内容が変更される場合があります。

Clipboard クラスは、単一スレッド アパートメント (STA) モードに設定されたスレッドでのみ使用できます。 このクラスを使用するには、 Main メソッドが STAThreadAttribute 属性でマークされていることを確認します。

1 つまたは複数の形式でクリップボードにデータを追加するには、 SetDataObject メソッドを使用します。 任意のオブジェクトをこのメソッドに渡します。 複数の形式のデータを追加するには、まず、複数の形式で動作するように設計された別のオブジェクトにデータを追加します。 通常、データを DataObjectに追加しますが、 IDataObject インターフェイスを実装する任意の型を使用できます。

1 つの共通の形式でクリップボードにデータを追加するには、テキストの SetText など、その形式に固有のメソッドを使用します。

Important

カスタム オブジェクトをクリップボードに配置するには、JSON にシリアル化できる必要があります。 JSON シリアル化を自動的に処理する SetDataAsJson などの新しいタイプ セーフメソッドを使用します。 レガシ SetData() メソッドは、 BinaryFormatterの削除により、.NET 9 以降のカスタム オブジェクトでは機能しなくなりました。

1 つの形式でデータを追加する

SetAudioSetFileDropListSetImage、または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

カスタム形式でデータを追加する

カスタム形式名とオブジェクトで Clipboard.SetDataAsJson<T>(String, T) メソッドを使用します。

SetDataAsJson<T>() メソッドは、System.Text.Jsonを使用してカスタム オブジェクトを自動的にシリアル化します。 これは、従来の SetData() メソッドよりも型の安全性とセキュリティ上の利点があるため、クリップボードにカスタム型を格納するために、.NET 10 以降で推奨されるアプローチです。

Important

レガシ SetData メソッドは、 BinaryFormatterの削除により、.NET 9 以降のカスタム オブジェクトでは機能しなくなりました。 代わりにカスタム型に SetDataAsJson<T>() を使用します。

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

前のスニペットで使用した Customer クラス:

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

複数の形式でデータを追加する

Clipboard.SetDataObject メソッドを使用し、データを含むDataObjectを渡します。

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

前のスニペットで使用した Customer クラス:

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

こちらも参照ください