【问题标题】:Why I cannot paste formatted text copied to clipboard?为什么我不能粘贴复制到剪贴板的格式化文本?
【发布时间】:2018-08-08 15:15:03
【问题描述】:

我正在尝试将一些 HTML 文本复制到剪贴板并能够粘贴它。

一个例子:

var text = @"<html>
<a href=""#"">Click me!</a><br/>
</html>";

Clipboard.SetText(text, TextDataFormat.Html);

当我尝试此操作时,剪贴板变为空,我无法将任何内容粘贴到文本文档或任何地方。当然,我可以通过以下方式获取文本:

var text = Clipboard.GetText(TextDataFormat.Html);

但这不是我想要的。我想要的行为是从浏览器复制 HTML 文本并将其粘贴到 Word 文档中,例如,必须保留格式。如果我不使用任何文本格式或使用TextDataFormat.Text,它会粘贴不带格式的文本。

有什么办法可以做到吗?

【问题讨论】:

  • 剪贴板类只能在设置为单线程单元 (STA) 模式的线程中使用。要使用此类,请确保您的 Main 方法标记有 STAThreadAttribute 属性。 msdn.microsoft.com/en-us/library/tbfb3z56(v=vs.110).aspx
  • @DipenShah 线程是 STA,否则它会抛出您共享的文档中提到的异常。没有抛出异常。
  • Clipboard.GetText(text, TextDataFormat.Html); 在哪里定义?你的意思是var text = Clipboard.GetText(TextDataFormat.Html);
  • @MickyD 是的,我的意思是Clipboard.GetText(TextDataFormat.Html);

标签: c# winforms


【解决方案1】:

HTML 数据格式并不意味着有效负载是纯 HTML。内容的结构在文档中描述,HTML Clipboard Format。 Version、StartHTML 和 EndHTML 元素是必需的。

以下代码将在剪贴板中放置一个 HTML sn-p,可以将其粘贴到理解 HTML 格式的应用程序中,例如 Word:

var text = @"Version:0.9
StartHTML:0000000055
EndHTML:0000000088
<a href='#'>Click me!</a><br/>";

System.Windows.Forms.Clipboard.SetText(text,TextDataFormat.Html);

没有这些元素,文本不会被识别为 HTML 有效负载,也无法粘贴。

HTML 格式可以包含比 sn-p 更多的内容。如果有人从浏览器复制文本,HTML 有效负载最终可能包含样式、字体和索引,这些 不是 实际 sn-p 的一部分,但对于正确呈现是必需的。复制后,此问题的标题如下所示:

Version:0.9
StartHTML:0000000224
EndHTML:0000001613
StartFragment:0000000260
EndFragment:0000001577
SourceURL:https://stackoverflow.com/questions/51750187/why-i-cannot-paste-formatted-text-copied-to-clipboard#51750187
<html>
<body>
<!--StartFragment--><h1 itemprop="name" class="grid--cell fs-headline1 fl1" style="margin: 0px 0px 0.5em; padding: 0px; border: 0px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-weight: inherit; font-stretch: inherit; line-height: 1.3; font-family: Arial, &quot;Helvetica Neue&quot;, Helvetica, sans-serif; font-size: 2.07692rem !important; vertical-align: baseline; box-sizing: inherit; flex: 1 1 auto !important; color: rgb(36, 39, 41); letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial;"><a href="https://stackoverflow.com/questions/51750187/why-i-cannot-paste-formatted-text-copied-to-clipboard" class="question-hyperlink" style="margin: 0px 0px 0.5em; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: normal; font-stretch: inherit; line-height: 1.35; font-family: inherit; font-size: 24px; vertical-align: baseline; box-sizing: inherit; color: rgb(36, 39, 41); text-decoration: none; cursor: pointer;">Why I cannot paste formatted text copied to clipboard?</a></h1><!--EndFragment-->
</body>
</html>00

返回 HTML 内容的代码是:

var obj=System.Windows.Forms.Clipboard.GetDataObject();
var html=obj.GetData("HTML Format");
Console.WriteLine(html);

浏览器使用多种格式添加数据。下面一行

Console.WriteLine(obj.GetFormats());

返回6种不同的格式:

  • HTML 格式
  • System.String
  • UnicodeText
  • 文字
  • 语言环境
  • OEMText

这一切的原因是剪贴板用于在使用或理解相同格式的应用程序之间传输数据。源应用程序以 理解的格式将数据添加到剪贴板。 来源有责任将尽可能多的数据放入剪贴板,以确保内容可以在另一端复制。

目标应用程序以他们理解的格式请求剪贴板数据。剪贴板可以尝试从一种格式转换为另一种格式。当这不可能时,它会返回NULL

多种格式

为了支持多个目标,应用程序可以创建一个包含多种格式的 DataObject。以下代码添加了一个可以粘贴到 Word 中的 HTML 有效负载和一个可以粘贴到任何文本编辑器中的文本有效负载:

var html = @"Version:0.9
StartHTML:0000000055
EndHTML:0000000088
<a href='#'>Click me!</a><br/>";

var plainText=@"<a href='#'>Click me!</a><br/>";

var obj=new DataObject();
obj.SetText(html,TextDataFormat.Html);
obj.SetText(plainText,TextDataFormat.Text);

Clipboard.SetDataObject(obj);

【讨论】:

  • 谢谢!这适用于 Word,但不适用于 google 文档,但我明白了,我需要使用 obj.GetData("HTML Format"); 来找出确切的格式并使其正常工作。
猜你喜欢
  • 2014-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-09
相关资源
最近更新 更多