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, "Helvetica Neue", 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);