将多个对象的组合复制到剪贴板(c# winforms)

Copy composite of multiple objects to clipboard (c# winforms)

C# Winforms 应用,Windows10.

表单有一个富文本框和一个图表(都是 MS)。目前有将richtextbox复制到剪贴板的功能:

    Clipboard.SetText(rtbContents.Rtf, TextDataFormat.Rtf);

以及将图表作为图像复制到剪贴板的功能:

    using (MemoryStream ms = new MemoryStream())
    {
        chart1.SaveImage(ms, ChartImageFormat.Bmp);
        Bitmap bm = new Bitmap(ms);
        Clipboard.SetImage(bm);
    }

需要一个将两者作为一个单元复制的功能(富文本在上,图像在下),以便 ctrl-v 将它们都粘贴到 Word 文档等文件中。

已尝试 IDataObject,但在不丢失颜色、字体大小和特殊字符的情况下,无法在对象中存储富文本。看起来 IDataObject 仍然一次只能粘贴一个东西,只是感知目标应用程序最可能想要的东西。

尝试使用 DrawString 组合 bmp,在富文本中保留多种颜色以及组装或连接位图时遇到问题。

尝试了 CopyFromScreen,在使用多个监视器定位和确定实际位置(this.Location.X 相对于容器,而不是屏幕)时遇到了麻烦,并且不完全符合规范,因为如果 richtextbox 是隐藏的或浮动的,则不会显示在顶部。更不用说,如果您尝试调试它,它会复制 Visual Studio 的一大块显示。

开源第三方解决方案可能没问题,找了一些但没有看到任何可以实现此功能的东西。 Win32 API 调用将是最后的手段。

在此先感谢您的帮助。

解决方案是使用剪贴板作为中间步骤。 Hacky 但有效。

    using (MemoryStream ms = new MemoryStream())
    {
        chart1.SaveImage(ms, ChartImageFormat.Bmp);
        Bitmap bm = new Bitmap(ms);
        Clipboard.SetImage(bm);
    }
    RichTextBox rtbCombination = new RichTextBox();
    rtbCombination.Rtf = ucLegend.rtbContents.Rtf;
    rtbCombination.Select(rtbCombination.Rtf.Length, 0);
    rtbCombination.AppendText(Environment.NewLine);
    rtbCombination.Select(rtbCombination.Rtf.Length, 0);
    rtbCombination.Paste();
    Clipboard.SetText(rtbCombination.Rtf, TextDataFormat.Rtf);