.net 为什么我的剪贴板数据在关闭表单后消失?

.net 为什么我的剪贴板数据在关闭表单后消失?,.net,vb.net,winforms,clipboard,.net,Vb.net,Winforms,Clipboard,我正在尝试将文本从RichtTextBox复制到剪贴板。问题是,在关闭包含此文本的表单后,剪贴板上的数据将消失。我在代码中尝试了以下操作: 我尝试了不同的方法来分别复制已经存在的内容: Dim data As String = RichTextBox1.SelectedRtf Clipboard.SetText(data, TextDataFormat.Rtf) Clipboard.SetData(DataFormats.Rtf, data) Clipboard.SetDataObject(d

我正在尝试将文本从RichtTextBox复制到剪贴板。问题是,在关闭包含此文本的表单后,剪贴板上的数据将消失。我在代码中尝试了以下操作:

我尝试了不同的方法来分别复制已经存在的内容:

Dim data As String = RichTextBox1.SelectedRtf

Clipboard.SetText(data, TextDataFormat.Rtf)
Clipboard.SetData(DataFormats.Rtf, data)
Clipboard.SetDataObject(data, True)
RichTextBox1.Copy()
无论是否指定RTF,结果都保持不变。此外,对于正常的文本字符串和/或使用快捷键CTRL+C时,以及是否将“True”作为参数传递给SetDataObject时,没有任何更改

我打开一个写字板窗口来测试这一点;对话框仍处于打开状态时进行复制和粘贴会导致正常粘贴。关闭对话框但不关闭应用程序会清除剪贴板,再次粘贴不会产生任何结果或新行

有谁知道为什么会发生这种行为以及如何修复它


提前谢谢

首先,您所做的每个剪贴板调用都会完全替换剪贴板内容,因此在一行中执行它们是不可行的;只有最后一个才有实际效果

至于您的问题,问题是Clipboard.SetDataObject确实可以与任何对象一起使用,但是它会自动计算出类型,因此它可能只会看到它是一个字符串,并将其作为类型文本(而不是RTF)输入。不过,使用它的预期方式是使用DataObject类的对象。我不知道他们为什么不指定SetDataObjectDataObject。。。超载;这会让用户更清楚地了解情况。老实说,在我看来,他们根本不懒惰

因此,无论如何,要使用Clipboard.SetDataObject?,True重载(确保应用程序关闭后数据保持不变)并正确设置内容类型,需要将第一个参数设置为该DataObject类的对象。因此,首先创建一个新的DataObject,然后将字符串放入using SetData,这允许显式指定类型,最后使用DataObject和参数调用SetDataObject函数以将数据保留在剪贴板上

' Get rich text snippet
Dim data As String = RichTextBox1.SelectedRtf
' Create data object
Dim dataObj As New DataObject()
' Put rich text snippet in data object
dataObj.SetData(DataFormats.Rtf, data)
' Put data object in clipboard, using the "copy=True" argument.
Clipboard.SetDataObject(dataObj, True)
请注意,DataObject是剪贴板数据的集合,用于同时以多种类型将内容放在剪贴板上。例如,您可以将代码段添加为RTF和纯文本,确保复制的内容也可以粘贴到应用程序中,如记事本:

Dim dataObj As New DataObject()
dataObj.SetData(DataFormats.Text, RichTextBox1.SelectedText)
dataObj.SetData(DataFormats.Rtf, RichTextBox1.SelectedRtf)
Clipboard.SetDataObject(dataObj, True)

可能是在关闭任何dispose语句时。我没有附加到关闭窗体时发生的任何事件的处理程序。当该窗体关闭或在打开它的窗体(如果是模态的)中清除剪贴板。如果您使用剪贴板查看器链模型添加了剪贴板挂钩,请改用AddClipboardFormatListener。如果我没记错,这将返回到VB6!所有这些剪贴板命令都将相互覆盖。每一个都将完全替换剪贴板上的内容。我已经编辑了我的原始问题以使其更清晰。我只是想表明我已经尝试了多种不同的方法来实现这一点。我没有同时运行所有函数。但谢谢你的澄清和回答。我会尽快尝试你的建议!经过测试,我们得到了一点,但更进一步,但仍然没有得到预期的结果。即使表单关闭后,文本仍保留在剪贴板中。这是朝着正确方向迈出的一步。但是,当关闭整个程序时,文本仍然会被清除。我已经对此进行了测试,并且,即使没有这个特殊代码,RichTextBox控件的正常Ctrl+C也会很好地复制文本,并在应用程序关闭后记住它。您确定程序中没有任何其他可能影响或清除剪贴板的代码吗?