Winform应用程序中如何实现Clipboard复制HTML内容?
- 内容介绍
- 文章标签
- 相关推荐
本文共计538个文字,预计阅读时间需要3分钟。
剪贴板针对不同的数据格式,在组织剪贴板内容时,需要遵循不同的格式要求。最简单的方法是复制一般文本内容,即复制一段普通的.txt文本内容。
使用方法如下:
1.调用 `ClipBord.Clear()` 清除剪贴板上的现有内容。
2.使用 `ClipBord.SetText(str)` 将新的文本内容 `str` 设置到剪贴板。
3.复制HTML内容时,确保将原始HTML内容放在引号 `` 内。
剪贴板针对不同的数据格式,在组织剪贴板内容时,有不同的格式要求。最简单的是,复制一般的.txt文本内容。使用方法 ClipBord.Clear(); ClipBord.SetText(str); 复制 Html,需要把原本的Html内容在包装一层。 详细:docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/aa767917(v=vs.85)?redirectedfrom=MSDN 在StartFragment和EndFragment之间的内容就是你自己的Html内容了。头部的键值对,键必须一样,值需要自己计算。 之间可以是Html内容,也可以是整个Html标签包含的内容,还包括Html标签。 我在网上找了个现成的方法,已经实验过了,是可以得:public string HtmlFData(string html) { StringBuilder sb = new StringBuilder(); Encoding encoding = Encoding.UTF8; //Encoding.GetEncoding(936); string Header = @" Version: 1.0 StartHTML: {0:000000} EndHTML: {1:000000} StartFragment: {2:000000} EndFragment: {3:000000} "; string HtmlPrefix = @" <!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.0 Transitional//EN""> <!--StartFragment--> "; string HtmlSuffix = @" <!--EndFragment--> "; // Get lengths of chunks int HeaderLength = encoding.GetByteCount(Header);//注意这里这样做,不直接取字符长度,是中文utf8占3字节,不是unicode的英文下的1字节 HeaderLength -= 16; // extra formatting characters {0:000000} int PrefixLength = encoding.GetByteCount(HtmlPrefix); int HtmlLength = encoding.GetByteCount(html); int SuffixLength = encoding.GetByteCount(HtmlSuffix); // Determine locations of chunks int StartHtml = HeaderLength; int StartFragment = StartHtml + PrefixLength; int EndFragment = StartFragment + HtmlLength; int EndHtml = EndFragment + SuffixLength; // Build the data sb.AppendFormat(Header, StartHtml, EndHtml, StartFragment, EndFragment); sb.Append(HtmlPrefix); sb.Append(html); sb.Append(HtmlSuffix); return sb.ToString(); }
然后,复制到剪贴板的代码:
var data = HtmlFData(strHtml); MemoryStream sMem = new MemoryStream(); byte[] byteHtml = Encoding.UTF8.GetBytes(data); sMem.Write(byteHtml, 0, byteHtml.Length); sMem.Flush(); var dataObject = new DataObject(); dataObject.SetData(DataFormats.Html, sMem); Clipboard.SetDataObject(dataObject); ... sMem.Close();
注意如果你直接用SetText这个api,并设置了Html格式,中文是会乱码的,所以这里用内存流把字符转为了utf-8的字节嘛保存的流对象里。
本文共计538个文字,预计阅读时间需要3分钟。
剪贴板针对不同的数据格式,在组织剪贴板内容时,需要遵循不同的格式要求。最简单的方法是复制一般文本内容,即复制一段普通的.txt文本内容。
使用方法如下:
1.调用 `ClipBord.Clear()` 清除剪贴板上的现有内容。
2.使用 `ClipBord.SetText(str)` 将新的文本内容 `str` 设置到剪贴板。
3.复制HTML内容时,确保将原始HTML内容放在引号 `` 内。
剪贴板针对不同的数据格式,在组织剪贴板内容时,有不同的格式要求。最简单的是,复制一般的.txt文本内容。使用方法 ClipBord.Clear(); ClipBord.SetText(str); 复制 Html,需要把原本的Html内容在包装一层。 详细:docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/aa767917(v=vs.85)?redirectedfrom=MSDN 在StartFragment和EndFragment之间的内容就是你自己的Html内容了。头部的键值对,键必须一样,值需要自己计算。 之间可以是Html内容,也可以是整个Html标签包含的内容,还包括Html标签。 我在网上找了个现成的方法,已经实验过了,是可以得:public string HtmlFData(string html) { StringBuilder sb = new StringBuilder(); Encoding encoding = Encoding.UTF8; //Encoding.GetEncoding(936); string Header = @" Version: 1.0 StartHTML: {0:000000} EndHTML: {1:000000} StartFragment: {2:000000} EndFragment: {3:000000} "; string HtmlPrefix = @" <!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.0 Transitional//EN""> <!--StartFragment--> "; string HtmlSuffix = @" <!--EndFragment--> "; // Get lengths of chunks int HeaderLength = encoding.GetByteCount(Header);//注意这里这样做,不直接取字符长度,是中文utf8占3字节,不是unicode的英文下的1字节 HeaderLength -= 16; // extra formatting characters {0:000000} int PrefixLength = encoding.GetByteCount(HtmlPrefix); int HtmlLength = encoding.GetByteCount(html); int SuffixLength = encoding.GetByteCount(HtmlSuffix); // Determine locations of chunks int StartHtml = HeaderLength; int StartFragment = StartHtml + PrefixLength; int EndFragment = StartFragment + HtmlLength; int EndHtml = EndFragment + SuffixLength; // Build the data sb.AppendFormat(Header, StartHtml, EndHtml, StartFragment, EndFragment); sb.Append(HtmlPrefix); sb.Append(html); sb.Append(HtmlSuffix); return sb.ToString(); }
然后,复制到剪贴板的代码:
var data = HtmlFData(strHtml); MemoryStream sMem = new MemoryStream(); byte[] byteHtml = Encoding.UTF8.GetBytes(data); sMem.Write(byteHtml, 0, byteHtml.Length); sMem.Flush(); var dataObject = new DataObject(); dataObject.SetData(DataFormats.Html, sMem); Clipboard.SetDataObject(dataObject); ... sMem.Close();
注意如果你直接用SetText这个api,并设置了Html格式,中文是会乱码的,所以这里用内存流把字符转为了utf-8的字节嘛保存的流对象里。

