Fork me on GitHub

ClipBord 复制 Html winform

剪贴板针对不同的数据格式,在组织剪贴板内容时,有不同的格式要求。最简单的是,复制一般的.txt文本内容。使用方法
ClipBord.Clear();
ClipBord.SetText(str);
复制 Html,需要把原本的Html内容在包装一层。
0
在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的字节嘛保存的流对象里。

posted @ 2022-05-19 17:17  HelloLLLLL  阅读(155)  评论(0编辑  收藏  举报