在客户端开发中,都涉及到大量类似的需求:从剪贴板里拷贝内容出来,复制内容到剪贴板,甚至有的时候,还需要针对富文本格式(如 Html 格式)来进行操作。用 C# 来实现此类功能特别简单,下面就对此类操作进行简单概述,主要是在 C# 的 Clipboard 类上做文章。

如果你直接从网页上复制了一段 Html 内容到剪贴板,则可以通过 C# 用下面的方式来获取 html 源文件

string format = "TextDataFormat.Html";
if (Clipboard.ContainsText(TextDataFormat.Html))
{
    String returnHtmlText = null;
    returnHtmlText = Clipboard.GetText(TextDataFormat.Html);
}

但是直接用上述代码,在处理中文 Html 的时候,获取的内容可能会是乱码。这个时候,我们可以人工转换编码来解决这个问题,例子代码如下:

if (Clipboard.ContainsText(TextDataFormat.Html))
{
    String returnHtmlText = null;

    MemoryStream vMemoryStream = Clipboard.GetData("Html Format") as MemoryStream;
    vMemoryStream.Position = 0;

    byte[] vBytes = new byte[vMemoryStream.Length];
    vMemoryStream.Read(vBytes, 0, (int)vMemoryStream.Length);

    returnHtmlText = Encoding.UTF8.GetString(vBytes); 
}

但是,如果你直接把通过上面获取的 Html 代码存成 Html 文件,那么打开这个 html 文件后,有可能依然会获得一个乱码文件,因为你没有给这个文件加上合适的 Html 头来让浏览器获取正确的编码格式。因为通过 Clipboard 获取的 Html 文本比较正规,对获取的文本加 Html 头的操作,可以简单地使用一个字符串替换来实现:

//adding <header> in html
string header = @"<html><head><meta http-equiv=""Content-Type"" content=""text/html; charset=utf-8"" /></head>";

returnHtmlText = returnHtmlText.Replace("<html>", header);

把所有代码合并在一起,就形成一个完整的获取剪贴板 Html 内容的程序:

if (Clipboard.ContainsText(TextDataFormat.Html))
{
    String returnHtmlText = null;

    MemoryStream vMemoryStream = Clipboard.GetData("Html Format") as MemoryStream;
    vMemoryStream.Position = 0;
    
    byte[] vBytes = new byte[vMemoryStream.Length];
    vMemoryStream.Read(vBytes, 0, (int)vMemoryStream.Length);

    returnHtmlText = Encoding.UTF8.GetString(vBytes); 
                
    //adding <header> in html
    string header = @"<html><head><meta http-equiv=""Content-Type"" content=""text/html; charset=utf-8"" /></head>";
    returnHtmlText = returnHtmlText.Replace("<html>", header);
}

对上述获得的 Html 字符串还可以进行后续操作,比如说显示、保存为网页文件等。当然,上述代码只是一个原型,需要更多的加工才能被正常使用在实际项目中。