2011-07-27 49 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數據。 問題是我只能在我的應用程序關閉時粘貼文件。這真是奇怪......

將應用程序關閉後,我可以沒有問題粘貼和粘貼文件是完全正確的。

有什麼建議嗎? 在此先感謝

回答

1

發生,剪貼板是共享系統資源,當你調用Clipboard.SetDataObject,在這裏調用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

是啊,其實我設法解決這個問題。上面的代碼在不同的線程中執行,每個客戶端一個。我認爲剪貼板方法完全是線程安全的,因爲它們在文檔中聲明,但顯然它們不是。無論如何,我通過在單個線程中調用上述代碼來解決此問題。 –

+0

確保它是線程安全的,但它不是安全問題;) –

+0

是啊,你說得對XD –