设置文本后剪贴板为空

本文关键字:剪贴板 置文本 | 更新日期: 2023-09-27 18:31:41

我有以下控制台程序:

using System.Windows.Forms;    
[STAThread]
public static void Main(string[] args)
{
    var text = Clipboard.GetText();
    Console.WriteLine("Input Text: " + text);
    Clipboard.SetText(text, TextDataFormat.Html);
    Console.WriteLine("Output Text: " + Clipboard.GetText());
    Console.WriteLine("Press any key to exit.");
    Console.ReadKey();
}

输入/输出如下所示:

Input Text: <table><tr><td>Hello, world!</td></tr></table>
Output Text: 
Exiting...

所需的输入/输出应如下所示:

Input Text: <table><tr><td>Hello, world!</td></tr></table>
Output Text: <table><tr><td>Hello, world!</td></tr></table>
Exiting...

基本上,我希望控制台程序将剪贴板中存储为纯文本的HTML数据转换为实际的HTML数据,并将其放回剪贴板中,以便我可以将其直接粘贴到Outlook电子邮件中,它将格式化为表格而不是文本。但我不明白为什么Clipboard.SetText()调用会清空剪贴板,而不是将文本放在具有正确数据类型的剪贴板中。如何更改程序以达到所需的输出?

设置文本后剪贴板为空

使用 GetText 的其他重载,因为您要指定TextDataFormat

Clipboard.GetText(TextDataFormat.Html))

知道了。显然,即使Outlook是HTML格式的邮件格式,您也不能只是将HTML粘贴到其中并将其呈现为表格。相反,您必须将纯文本转换为富文本格式,然后将其粘贴到Outlook中。显然,在.NET中将HTML转换为RTF并没有一个很好的解决方案,您必须使用Windows窗体库中的WebBrowser控件和RichTextBox。代码如下:

[STAThread]
public static void Main(string[] args)
{
    //string input = "<table><tr><td>Hello, world!</td></tr></table>";
    string input = Clipboard.GetText();
    ConvertToRTF(input);
    string text = Clipboard.GetText(TextDataFormat.Rtf);
    Clipboard.SetText(text,TextDataFormat.Rtf);
}
public static void ConvertToRTF(string html)
{
    RichTextBox rtbTemp = new RichTextBox();
    WebBrowser wb = new WebBrowser();
    wb.Navigate("about:blank");
    wb.Document.Write(html);
    wb.Document.ExecCommand("SelectAll", false, null);
    wb.Document.ExecCommand("Copy", false, null);
    rtbTemp.SelectAll();
    rtbTemp.Paste();
    rtbTemp.Copy();
}