2

我想将多个内容复制到剪贴板:

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()));
    }

但是刚刚得到了有意义的 imageandtext 的“to string”。必须有一种数据格式可以用来告诉 MS 它正在获取图像和文本?是秘密吗?

4

1 回答 1

2

目前我正在使用 RTF 进行这项工作,但对于我想要实现的目标来说,这似乎有点矫枉过正......

我从代码项目中获取了这个不错的小型 RTF 库,感谢 Dima 与世界分享这个:)

我对其进行了修改,添加了一个额外的函数来写入剪贴板(我确信这个额外的函数可以添加得更好,但它确实有效)('cough' 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,它只是 write 函数的 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 应用程序,它有一个很好的好处,我可以做花哨的格式化等。

ps

一个警告,如果你只是为了它而向图像添加文本(或反之亦然),不要,因为警告只是向剪贴板添加位图被更多应用程序识别(例如绘画) ,同样的 RTF 说记事本不是很干净:p。

因此,您实际上通过走 RTF 路线来限制应用程序数据的潜在交叉(请参阅下面的更新) 。对我来说,文本实际上不仅仅是一个“标题”,它是解释图像是如何创建的大量数据(因此,为什么花哨的格式实际上非常有用,但为了简洁起见,我已经简化了所有这些)。我实际上发现自己将此添加为“cntrl+shift+c”选项并保留“ctnrl+c”作为向剪贴板添加好的旧位图。

- 更新 - -

原来您可以将RTF 文件复制并粘贴到 word 中。因此,您可以跳过额外写入剪贴板部分并创建文件,然后将文件添加到剪贴板。这实际上允许您拥有多个图像+文本项目,缺点是它作为嵌入式文档粘贴到 word 中,但这实际上更适合我想要的。

事实证明,您可以解决应用程序限制问题,因为您可以将多种类型并行添加到剪贴板。所以我目前将它作为 RTF 文件和位图添加到剪贴板。执行“ setimage ”不会覆盖“ setfile

这样,当我粘贴到 word 中时,我会得到带有图像和位图的 RTF。

当我粘贴到油漆中时,我只粘贴图像:)(事实上,当我添加到位图剪贴板时,我使用 GDI 来写标题)

它实际上非常酷,它适用于各种程序。有趣的是,不同的办公程序有不同的默认“选择”。Word 似乎选择了 RTF,而 Powerpoint 将选择位图。

于 2015-02-18T12:39:34.763 回答