2011-07-27 6 views
0

私のアプリケーションでは、非常に奇妙なクリップボードの動作に直面しています。 いくつかのファイルを受信し、一時的な場所に保存してクリップボードに保存するTcpサーバーがあります。 は、ここでは、コードの一部です:FileDrop形式の奇数クリップボードの動作

filename = bReader.ReadString(); 
int dim = bReader.ReadInt32(); 
byte[] buffer = new byte[dim]; 
buffer = bReader.ReadBytes(dim); 
using (FileStream fs = new FileStream(type, FileMode.OpenOrCreate, FileAccess.Write)) 
{ 
    fs.Write(buffer, 0, buffer.Length); 
    fs.Close(); 
}      
String path = Path.GetFullPath(filename); 
DataObject data = new DataObject(); 
data.SetData(DataFormats.FileDrop, true, new String[]{path}); 
Clipboard.SetDataObject(data, true); 

私が受信して保存したファイルを正しく、そしてまた、彼は、クリップボード内のデータをFileDrop置くことができます。 問題は、アプリケーションが閉じられたときにのみファイルを貼り付けることができるということです。それは本当に変だ...

アプリケーションが終了すると、私は問題なく貼り付けることができ、貼り付けられたファイルは完全に正しいです。

提案がありますか?あなたがClipboard.SetDataObjectを呼び出したときに事前に おかげで

答えて

1

この起こりうる、クリップボードを共有システムリソースである、それはあなたのプログラムが、それはので、他のアプリケーションを使用することはできません開くかもしれないので、ここでuser32 API関数OpenClipboardに、問題を呼び出しますアプリケーションがまだ実行中の間カスタムメタファイルを使用している場合は、これも問題になる可能性があります。thisをチェックしてください。とにかく私は「それが重要な場合、私は4.0を使用しています」このコードを実行します。

DataObject data = new DataObject(); 
data.SetData(DataFormats.FileDrop, true, new String[] { @"C:\test.txt" }); 
Clipboard.SetDataObject(data, true); 

をしかし、私はあなたが記載されている問題を確認することができなかった、窓は、プログラムの実行中にコピー操作を参照し、その閉じた後にすることができます。あなたはそのコードからClipboardにしかアクセスできませんか?あなたのデータを「あなたのフォームに貼り付ける」ことをどう読んでいますか?

+0

ええ、実際に私は問題を解決することができました。上記のコードはクライアントごとに1つずつ異なるスレッドで実行されていました。クリップボードのメソッドは完全にスレッドセーフであると思っていましたが、ドキュメントに記載されていますが、明らかにそうではありません。とにかく、私は上記のコードを1つのスレッドで呼び出すことでこの問題を解決しました。 –

+0

スレッドセーフですが、問題はありません安全です;) –

+0

ええ、そうですねXD –