Скопируйте несколько (например, изображения и текст) вещи в буфер обмена для вставки в MS Office C# Winform

Я хочу скопировать несколько вещей в буфер обмена:

Clipboard.SetImage(Image);
Clipboard.SetText(ImageCaption);  

Однако я заметил, что все функции Clipboard.Set* сначала очищают буфер обмена. Таким образом, в приведенном выше примере вы получите только текст. Есть ли какой-нибудь "добавочный" эквивалент?

По крайней мере, я хотел бы иметь возможность добавить растровое изображение и некоторый текст в буфер обмена, чтобы их можно было вставить вместе в такое приложение, как Microsoft Office.

Я нахально попробовал:

    [Serializable]
    public class ImageAndText
    {
        public readonly string text;
        public readonly Bitmap image;

        public ImageAndText(string text, Bitmap image)
        {
            this.text = text;
            this.image = image;
        }
    }
    private void CopyToClipBoard()
    {

        Clipboard.SetData(DataFormats.Rtf , new ImageAndText(NewLayer.RecursionLog, rootLayer.GetBitmapTrueRes()));
    }

Но только что получил "строку" изображения и текста, который имеет смысл. Должен быть формат данных, который я могу использовать, чтобы сказать MS, что он получает изображение и текст? Это секрет?

1 ответ

Решение

В настоящее время у меня есть эта работа с использованием RTF, но это кажется излишним для того, чего я хотел достичь...

Я взял эту симпатичную маленькую RTF-библиотеку вне кода, спасибо, Дима, за то, что поделился этим с миром:)

И я изменил его, добавив одну дополнительную функцию для записи в буфер обмена (я уверен, что дополнительная функция могла бы быть добавлена ​​лучше, но она работает)('кашель' hacky'cough')

Код для копирования моего изображения и текста в буфер обмена стал:

private void CopyDetailToClipBoard(string caption, Image image)
{

    //using rtf data format, put a bunch of data onto the clipboard
    RtfDocument rtf = new RtfDocument();
    RtfParagraph rtfTextBlock = new RtfParagraph();             
    const int captionFontSize = 22;


   //add main image to rtf text
    RtfImage image = new RtfImage(image, RtfImageFormat.Png);
    rtfTextBlock.AppendParagraph(image);

    //add caption
    RtfFormattedText Caption = new RtfFormattedText(caption,
        RtfCharacterFormatting.Underline | RtfCharacterFormatting.Bold,
        1,
        captionFontSize);      

    rtfTextBlock.AppendParagraph(Caption);

    rtf.Contents.Add(rtfTextBlock);

    //write the rtf to the clipboard
    RtfWriter rtfWriter = new RtfWriter();
    rtfWriter.WriteToClipBoard(rtf);
}

И дополнительная функция, которую я добавил в библиотеку RTF, была "WriteToClipbard", которую я добавил в RtfWriter.cs и которая была просто C & P функции записи, но вместо записи строки в файл она записывает в буфер обмена (было бы лучше, если бы я изменил RtfDocument, чтобы просто иметь "tostring", который можно использовать в любом сценарии)

//Where rtfWriter.WriteToClipBoard is a modified version of the "Write" function:
public void WriteToClipBoard(RtfDocument document)
{
    _encoding = Encoding.GetEncoding((int)document.CodePage);

    sb = new StringBuilder();

    Reflect(document);

    Clipboard.SetData(DataFormats.Rtf, sb.ToString());
}

Я все еще надеюсь, что есть более "легкое" решение, чем это, но это работает для копирования из моего приложения в Word / любое приложение RTF, и у него есть приятный бонус, что я могу сделать необычное форматирование и т. Д.

п.с.

Предупреждающее слово, если вы просто добавляете текст к изображению (или наоборот) просто так, не делайте этого, потому что предостережение о добавлении всего лишь растрового изображения в буфер обмена распознается многими приложениями (например, рисованием) в равной степени RTF в блокноте, скажем, не очень чистый: с.

Таким образом, вы фактически ограничиваете потенциальное пересечение(см. Ниже обновление) данных вашего приложения, следуя по маршруту RTF. Для меня текст на самом деле больше, чем просто "подпись", это целый набор данных, объясняющих, как было создано изображение (следовательно, причудливое форматирование на самом деле весьма полезно, но я упростил все это для краткости). Я действительно нашел себя добавив его в качестве опции "cntrl + shift + c" и сохранив "ctnrl + c", как добавление старого доброго растрового изображения в буфер обмена.

--ОБНОВИТЬ---

Оказывается, вы можете копировать и вставлять файлы RTF в слово. Таким образом, вы можете пропустить дополнительную часть записи в буфер обмена и создать файл, а затем добавить файл в буфер обмена. Это фактически позволяет вам иметь несколько изображений + текстовые элементы, недостатком является то, что он вставляется в слово как встроенный документ, но на самом деле это было лучше, чем я хотел.

Также оказывается, что вы можете обойти проблему ограничения приложений, поскольку вы можете параллельно добавлять несколько типов в буфер обмена. Поэтому я добавляю его в буфер обмена как файл RTF и растровое изображение. выполнение " setimage" не перезаписывает " setfile"

Таким образом, когда я вставляю слово, я получаю RTF с изображением и растровым изображением.

Когда я вставляю в краску, я вставляю только изображение:) (на самом деле, когда я добавляю в растровый буфер обмена, я использую GDI для надписи)

На самом деле очень круто, как это работает для различных программ. Интересно, что разные офисные программы имеют разные "варианты" по умолчанию. Word, кажется, выбирает RTF, тогда как Powerpoint выбирает растровое изображение.

Другие вопросы по тегам