Почему нельзя использовать getdata и setdata после копирования документа - PullRequest
0 голосов
/ 28 марта 2020

Я хочу скопировать весь контент из 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 получили те же результаты.

...