如何在C#中将HTML设置为剪贴板?

Art*_*hur 14 .net html c# clipboard

我想在剪贴板上放置HTML格式的富文本,这样当用户粘贴到Word时,它将包含源HTML格式.

使用Clipboard.SetText方法不起作用.

此外,我希望如果用户粘贴到像Word这样的丰富编辑器,它将粘贴格式化文本,如果它们粘贴到像记事本这样的普通编辑器,它将粘贴纯文本.

Art*_*hur 24

设置HTML文本时,您需要提供一个标题,其中包含您实际要粘贴的html片段的附加信息,同时能够为其提供额外的样式:

Version:0.9
StartHTML:000125
EndHTML:000260
StartFragment:000209
EndFragment:000222
<HTML>
<head>
<title>HTML clipboard</title>
</head>
<body>
<!–StartFragment–><b>Hello!</b><!–EndFragment–>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

使用标题(和正确的索引),调用Clipboard.SetTextwith TextDataFormat.Html将起到作用.

要处理HTML和纯文本粘贴,您不能使用该Clipboard.SetText方法,因为它会在每次调用时清除剪贴板; 你需要创建一个DataObject实例,SetData用HTML 调用它的方法一次,用纯文本调用一次,然后使用将对象设置为剪贴板Clipboard.SetDataObject.

更新

有关更多详细信息和ClipboardHelper实现,请参阅" 将HTML /文本设置为重新访问剪贴板 " .

  • 标题中的实际数字似乎完全错误。我完全不清楚这些数字是如何计算的,我发现的每一篇文章,包括这篇文章,都没有解释这一点。我能找到的最好的是神秘的代码,它也无济于事。 (3认同)
  • 阅读链接帖子,值得! (2认同)

Der*_*rek 7

我找到了一些代码:https : //www.experts-exchange.com/questions/21966855/Create-a-hyperlink-in-VB-net-copy-to-clipboard-Should-be-able-to-paste-hyperlink -in-Microsoft-Word-Excel.html

此代码处理更新开始和结束索引的问题。

转换为 C#:

public void AddHyperlinkToClipboard(string link, string description)
{
    const string sContextStart = "<HTML><BODY><!--StartFragment -->";
    const string sContextEnd = "<!--EndFragment --></BODY></HTML>";
    const string m_sDescription = "Version:1.0" + Constants.vbCrLf + "StartHTML:aaaaaaaaaa" + Constants.vbCrLf + "EndHTML:bbbbbbbbbb" + Constants.vbCrLf + "StartFragment:cccccccccc" + Constants.vbCrLf + "EndFragment:dddddddddd" + Constants.vbCrLf;

    string sHtmlFragment = "<A HREF=" + Strings.Chr(34) + link + Strings.Chr(34) + ">" + description + "</A>";

    string sData = m_sDescription + sContextStart + sHtmlFragment + sContextEnd;
    sData = sData.Replace("aaaaaaaaaa", m_sDescription.Length.ToString().PadLeft(10, '0'));
    sData = sData.Replace("bbbbbbbbbb", sData.Length.ToString().PadLeft(10, '0'));
    sData = sData.Replace("cccccccccc", (m_sDescription + sContextStart).Length.ToString().PadLeft(10, '0'));
    sData = sData.Replace("dddddddddd", (m_sDescription + sContextStart + sHtmlFragment).Length.ToString().PadLeft(10, '0'));
    sData.Dump();
    Clipboard.SetDataObject(new DataObject(DataFormats.Html, sData), true );
}
Run Code Online (Sandbox Code Playgroud)