5

我正在尝试将文件中的图像和文件中的文本复制到剪贴板。我的意图是打开一个 word 文档或一封 Outlook 电子邮件,并将文本和图像粘贴到一个标准粘贴命令(例如 CTRL-V)中。我可以很容易地分别做这两个,但是在一个操作中同时做这两个似乎不起作用。

这就是我如何让这两个作为单独的操作工作(当然只有相关的代码行,去掉 try/catch 等):

将图像添加到剪贴板:

...

Bitmap imageToAdd = new Bitmap(imageFilePath);
Clipboard.SetImage(imageToAdd);

...

将文本添加到剪贴板:

...

StreamReader rdr = new StreamReader(textFilePath);
string text = rdr.ReadToEnd();

Clipboard.SetText(text);

...

我正在使用 c# 和 .net 2.0 框架并针对 Windows XP(在不久的将来可能还会使用 Vista)。

TIA

4

4 回答 4

5

您可以使用 RTF,它可以结合文本和图形。请注意,您可以在剪贴板上同时拥有 CF_BITMAP 和 CF_TEXT。但这没有用。粘贴到记事本时会得到文本,粘贴到 Paint 时会得到位图,大多数其他应用程序会选择其中一个,但绝不会两者兼而有之。所以这只是学术性的。有点整洁,就像星际迷航中的运输机故障一样整洁。但也很乱。

于 2010-12-01T23:59:24.257 回答
1

也许您可以使用需要 Object 参数的 SetDataObject,您可以使用对象数组?

对象数组可以保存您所需的数据。

请参阅此链接:

http://msdn.microsoft.com/en-us/library/5b8kt5z4.aspx

于 2008-11-12T21:25:18.643 回答
1

我注意到只能传入一个对象。

在这种情况下,当用户按下命令进行粘贴时,你的代码可以执行两个函数,或者递归地执行一个函数,每次都得到你想要的数据并粘贴进去。

所以,看看循环或递归。

于 2008-11-20T23:18:08.500 回答
0

添加具体代码实现;

// Load a bitmap without locking it.
private Bitmap LoadBitmapUnlocked(string path)
{
    using (Bitmap bm = new Bitmap(path))
    {
        return new Bitmap(bm);
    }
}

...

string path = 
@"C:\Windows\Web\Wallpaper\Architecture\img13.jpg"; 
DataObject dataObj = new DataObject();
dataObj.SetData(DataFormats.Bitmap, true, LoadBitmapUnlocked(path));
dataObj.SetData(DataFormats.UnicodeText, path);
Clipboard.SetDataObject(dataObj);
于 2020-05-11T21:34:14.690 回答