お世話になっております。  
度々の質問ですみません。  
C#ですでに入っているクリップボードの内容に新しくフォーマットを追加しようとしています。  
例えば、クリップボードにファイルがコピーされている状態で、そこに文字列等のデータを追加するイメージです。  
下記はクリップボードにあるデータを取得して、そこに文字列を追加しようとしています。

```

    using System.Windows.Forms;
    
    IDataObject data = Clipboard.GetDataObject();
    if (data == null){
    return;
    }else{
    data.SetData(DataFormats.Text, 内容);
    Clipboard.SetDataObject(data, true);
    }
    
```

しかし、このコードではうまく動かないようで、文字列がコピーされていないどころか、以前にコピーしていた内容も消えてしまっているようです。  
ファイルをコピーした状態で、クリップボードに格納されているフォーマットを確認すると、下記のようになっています。

```

    FileDrop,FileNameW,FileName,Preferred DropEffect
    
```

その後、上記のコードで文字列データを追加すると、フォーマット一覧は下記のようになっていますが、実際に文字列を貼り付けようとしたり、ファイルを貼り付けようとすると、貼り付けできません。

```

    FileDrop,FileNameW,FileName,Preferred DropEffect
    
```

上記コードのどこが問題なのか、教えていただけないでしょうか。  
以上、よろしくお願いいたします。
CC BY-SA 4.0
2020-03-10T08:25:06.217
63730
2020-08-18T10:02:20.250
29034
question
c#
C#で既存のクリップボードの内容にフォーマットを追加する方法
クリップボードは正確にはOLE
Clipboardといい、実体は[コピー元が提供する`IDataObject`を貼り付け先が読み取る](https://docs.microsoft.com/en-
us/windows/win32/com/data-transfer-interfaces)ことで実現されています。  
.NET
Frameworkでは`IDataObject`（[`System.Runtime.InteropServices.ComTypes.IDataObject`](https://docs.microsoft.com/ja-
jp/dotnet/api/system.runtime.interopservices.comtypes.idataobject?view=netframework-4.8)）そのままでは扱いづらいため、ランタイムがラップした`IDataObject`（[`System.Windows.Forms.IDataObject`](https://docs.microsoft.com/ja-
jp/dotnet/api/system.windows.forms.idataobject?view=netframework-4.8)）が使われます。

質問で挙げられたコードもあくまで自プロセス内でラップしたオブジェクトが対象となっています。また、先に触れたようにコピー元と貼り付け先とが`IDataObject`を介したネゴシエーションですから、第三者が介入できませんし、やるべきでもありません。最悪の場合、ウィルス他、侵入行為と判断され得ます。
CC BY-SA 4.0
2020-03-10T14:08:00.030
63740
2020-03-10T14:08:00.030
4236
63730
answer