【问题标题】:Why is my clipboard data gone after closing the form?为什么关闭表单后我的剪贴板数据消失了?
【发布时间】:2020-01-27 08:27:51
【问题描述】:

我正在尝试将文本从 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 时,没有任何变化。

我打开了一个写字板窗口来测试一下;当对话框仍然打开时复制和粘贴会导致正常粘贴。关闭对话框(但不是应用程序)会清除剪贴板并再次粘贴会导致任何内容或新行。

有谁知道为什么会发生这种行为以及如何解决它?

提前致谢!

【问题讨论】:

  • 可能在关闭任何 dispose 语句时
  • 我没有处理关闭表单时发生的任何事件。
  • 当表单关闭或打开它的表单(如果它是模态的)时,您正在清除剪贴板。如果您使用剪贴板查看器链模型添加了剪贴板挂钩,请改用AddClipboardFormatListener
  • 如果我没记错的话,这可以追溯到 VB6!
  • 所有这些剪贴板命令将相互覆盖。每个都将完全替换剪贴板的内容。

标签: .net vb.net winforms clipboard


【解决方案1】:

首先,您所做的每个剪贴板调用都会完全替换剪贴板内容,因此连续执行它们是行不通的;只有最后一个实际上会产生任何影响。

至于您的问题,问题是Clipboard.SetDataObject 确实可以与任何对象一起使用,但是它会自动计算出类型,因此它可能只会看到它是String 并将其作为@ 类型输入987654324@,而不是RTF。不过,预期的使用方式是woefully underdocumented in the MSDN docs,是使用DataObject 类的对象。我不确定他们为什么没有为此制作特定的SetDataObject(DataObject, ...) 重载;它会让用户更清楚地了解事情。老实说,在我看来,他们没有这样做是纯粹的懒惰。

所以,无论如何,要使用Clipboard.SetDataObject(?, True) 重载,以确保数据在应用程序关闭后仍然存在,并且让它正确设置您的内容类型,您需要将第一个参数设为对象那个DataObject 类。所以首先创建一个New DataObject,然后将字符串放入使用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 是剪贴板数据的集合,用于将多种类型的内容同时放在剪贴板上。例如,您可以将 sn-p 添加为 RTF 和纯文本,确保您复制的内容也可以粘贴到记事本等应用程序中:

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

【讨论】:

  • 我已经编辑了我原来的问题,以便更清楚。我只是想表明我已经尝试了多种不同的方法来让它发挥作用。我没有一次运行所有功能。但是感谢您的澄清和回答。我会尽快尝试您的建议!
  • 在测试了这个之后,我们得到了一点但更进一步,但仍然没有得到想要的结果。即使在表单关闭后,文本仍保留在剪贴板中。这是朝着正确方向迈出的一步。但是,当关闭整个程序时,文本仍然会被清除。
  • 我已经对此进行了测试,即使没有这个特殊代码,RichTextBox 控件的正常 Ctrl+C 也可以很好地复制文本,并在应用程序关闭后记住它。您确定程序中没有任何可能影响或清除剪贴板的其他代码吗?
猜你喜欢
  • 2012-06-19
  • 2015-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-13
  • 2012-04-28
相关资源
最近更新 更多