C#备份和恢复剪贴板

我有一个使用剪贴板的程序,但我希望在完成后将剪贴板恢复到以前的状态。

这是我的代码:

IDataObject temp = Clipboard.GetDataObject(); //Some stuff that change Cliboard here Clipboard.SetText("Hello"); //Some stuff that change Cliboard here Clipboard.SetDataObject(temp); 

但是,如果我复制一个文本并运行此代码,我在记事本上什么也得不到。

注意:我不能使用Clipboard.Contains,因为我想保留剪贴板EXACLY之前的状态,即使用户复制了一个文件。

我无法确认这是否有效,但我认为没有理由不使用实际读取数据的较长方法并在之后恢复数据来备份数据。

在这里阅读: http : //msdn.microsoft.com/en-us/library/system.windows.forms.idataobject.aspx

你会做类似的(伪代码)

 //Backup var lBackup = new Dictionary(); var lDataObject = Clipboard.GetDataObject(); var lFormats = lDataObject.GetFormats(false); foreach(var lFormat in lFormats) { lBackup.Add(lFormat, lDataObject.GetData(lFormat, false)); } //Set test data Clipboard.SetText("asd"); //Would be interesting to check the contents of lDataObject here //Restore data foreach(var lFormat in lFormats) { lDataObject.SetData(lBackup[lFormat]); } //This might be unnecessary Clipboard.SetDataObject(lDataObject); 

重置剪贴板后,您的应用程序是否已退出?

假设它是一个Win Form应用程序。 (不知道它在wpf中是如何工作的)你可以使用Clipboard.SetDataObject的另一个重载版本之一

 public static void SetDataObject(object data, bool copy) 

即使在您的应用退出后,它也会保留数据。

例如:在你删除文本内容后你可以调用Clipboard.SetDataObject(iDataObject, true);

编辑:2

我可以通过Clipboard.cs .NET Frameword 4 / VS 2010获取步骤。从这里http://referencesource.microsoft.com/netframework.aspx下载.NET Framework 4。 按照以下步骤,如果它要求源(Clipboard.cs),它将在安装目录的Source子目录中。

编辑:1

不确定为什么相同的代码不起作用。 不能是安全/权限问题,因为代码不会像你说的那样抛出exception。

还有另一种方法 – 源代码进入框架代码 – Clipboard.cs基于VS版本和.NET框架,它可能会有所不同(我无法获得.NET 4的源步进工作,因为信息是带有源支持的符号还没有被释放)。 我试着从这里手动下载(.NET版本4)

如果您运行的是VS 2008及更早版本的.NET,则以下步骤适合您。

源符号设置

常规调试设置

更多细节在这里 。 对于.NET Framework 4 – 此处

我已经成功了。

……在某种程度上。

我目前正在倒下的地方是尝试复制和恢复不同大小的位图。 我可以成功复制和恢复小尺寸的位图。

然后,我尝试做同样的事情(正如预警Chris Thornton建议的那样)一个庞大的Excel工作表,其中包含数千个单元格数据,以及位于同一工作表上的两组数据。

我发现数据复制和恢复没有问题。 在这种情况下它落在哪里是允许带有工作表副本的2组图。

如果你们中的任何一个人在复制和恢复位图时遇到了问题,那么让我建议一下对我有用的东西:当试图恢复剪贴板时,以相反的顺序遍历格式列表并以这种方式设置每个数据对象。 (即似乎必须按照复制的相反顺序设置剪贴板)

关于庞大的Excel工作表和附图的情况,我还遇到了另一个绊脚石:我无法成功复制格式为“元数据文件”的数据对象。 这可能是复制/恢复在这种情况下不起作用的原因。

大约两周前,我得到了这个,并提出了更紧迫的问题。

我想把它放在那里让任何其他人试图做同样的事情似乎可以做到。 (任何东西都可以在计算机科学中完成。任何东西。)

这是不可能做到的。 您无法备份/恢复剪贴板而不会导致意外后果。 请在类似问题上查看我的post。 我的回答是以“尝试这样做是愚蠢的”开头的。

如何在C#中备份和恢复系统剪贴板?

此外,我怀疑你想要备份/恢复剪贴板的动机是因为你想在没有用户知情或同意的情况下将它用作移动数据的拐杖。 请阅读: http : //www.clipboardextender.com/developing-clipboard-aware-programs-for-windows/common-general-clipboard-mistakes和http://www.flounder.com/badprogram.htm#clipboard

最后,请阅读并理解这句话:

“程序不应该在没有用户明确指示的情况下将数据传输到我们的剪贴板中。” – Charles Petzold,编程Windows 3.1,Microsoft Press,1992