Я хочу скопировать весь контент из Word в буфер обмена, обработать его, а затем отправить обратно в буфер обмена.
Я использую этот код и получаю исключение, когда он нажимает setdata
или Clipboard.Clear()
using System;
using System.Windows.Forms;
using Microsoft.Office.Tools.Ribbon;
using HtmlAgilityPack;
using System.Text.RegularExpressions;
using System.Linq;
using System.Text;
using System.IO;
using System.Data;
Doc.Application.ActiveDocument.Content.Select();
Doc.Application.Selection.Copy();
Doc.Application.Selection.Collapse();
IDataObject clipData = Clipboard.GetDataObject();
String clipHtml = null;
if (clipData.GetDataPresent(DataFormats.Html))
{
clipHtml = (String)clipData.GetData(DataFormats.Html);
}
String html = "<h1>Hello</h1>";
Encoding enc = Encoding.UTF8;
string begin = "Version:0.9\r\nStartHTML:{0:000000}\r\nEndHTML:{1:000000}"
+ "\r\nStartFragment:{2:000000}\r\nEndFragment:{3:000000}\r\n";
string html_begin = "<html>\r\n<head>\r\n"
+ "<meta http-equiv=\"Content-Type\""
+ " content=\"text/html; charset=" + enc.WebName + "\">\r\n"
+ "<title>HTML clipboard</title>\r\n</head>\r\n<body>\r\n"
+ "<!--StartFragment-->";
string html_end = "<!--EndFragment-->\r\n</body>\r\n</html>\r\n";
string begin_sample = String.Format(begin, 0, 0, 0, 0);
int count_begin = enc.GetByteCount(begin_sample);
int count_html_begin = enc.GetByteCount(html_begin);
int count_html = enc.GetByteCount(html);
int count_html_end = enc.GetByteCount(html_end);
string html_total = String.Format(
begin
, count_begin
, count_begin + count_html_begin + count_html + count_html_end
, count_begin + count_html_begin
, count_begin + count_html_begin + count_html
) + html_begin + html + html_end;
DataObject obj = new DataObject();
obj.SetData(DataFormats.Html, new MemoryStream(
enc.GetBytes(html_total)));
Clipboard.SetDataObject(obj, true, 2, 100);
Если я закомментирую Clipboard.GetDataObject
, тогда SetDataObject
работает хорошо.
Но если сохраняется Clipboard.Clear()
или Clipboard.SetDataObject
, я получаю то же исключение:
ErrorCode: -2147221040
Если я закомментирую Doc.Application.Selection.Copy()
, Clipboard.SetDataObject
также хорошо работает.
Почему я не могу использовать Copy
и GetDataObject
, затем SetDataObject
одновременно?
Я пытался. Net 4 и. Net 4.6.1 получили те же результаты.