2011-07-27 55 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 –