質問: null){ return; }else{ data.SetData(DataFormats.Text, 内容); Clipboard.SetDataObject(data, true); } ``` しかし、このコードではうまく動かないようで、文字列がコピーされていないどころか、以前にコピーしていた内容も消えてしまっているようです。 ファイルをコピーした状態で、クリップボードに格納されているフォーマットを確認すると、下記のようになっています。 ``` FileDrop,FileNameW,FileName,Preferred DropEffect ``` その後、上記のコードで文字列データを追加すると、フォーマット一覧は下記のようになっていますが、実際に文字列を貼り付けようとしたり、ファイルを貼り付けようとすると、貼り付けできません。 ``` FileDrop,FileNameW,FileName,Preferred DropEffect ``` 上記コードのどこが問題なのか、教えていただけないでしょうか。 以上、よろしくお願いいたします。
回答: クリップボードは正確にはOLE Clipboardといい、実体はコピー元が提供する`IDataObject`を貼り付け先が読み取ることで実現されています。 .NET Frameworkでは`IDataObject`(`System.Runtime.InteropServices.ComTypes.IDataObject`)そのままでは扱いづらいため、ランタイムがラップした`IDataObject`(`System.Windows.Forms.IDataObject`)が使われます。 質問で挙げられたコードもあくまで自プロセス内でラップしたオブジェクトが対象となっています。また、先に触れたようにコピー元と貼り付け先とが`IDataObject`を介したネゴシエーションですから、第三者が介入できませんし、やるべきでもありません。最悪の場合、ウィルス他、侵入行為と判断され得ます。