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