C ++:如何将多个对象复制到剪贴板并在其后提取它们?

时间:2011-05-14 10:52:37

标签: c++ winapi clipboard

我需要将字符串和位图复制到剪贴板。 我已经实现了字符串的复制:

if(OpenClipboard(NULL))
{
HGLOBAL clipbuffer;
char * buffer;
EmptyClipboard();
clipbuffer = GlobalAlloc(GMEM_DDESHARE, strlen(source)+1);
buffer = (char*)GlobalLock(clipbuffer);
strcpy(buffer, LPCSTR(source));
GlobalUnlock(clipbuffer);
SetClipboardData(CF_TEXT,clipbuffer);
CloseClipboard();
}

我也知道如何复制图像,但我必须一次复制这两个对象 (以便在其他过程中获取它们)。 请建议

5 个答案:

答案 0 :(得分:2)

这是一个相当困难的壮举,因为将两个不同类型的对象放入一个数据结构中(剪贴板一次只能容纳一个东西)会创建一个复合体,另一端的程序可能无法理解。除非您也编程了该程序,因此可以添加额外的逻辑。有时接收程序理解超文本,因此复制链接到图像的一些超文本也可以解决问题。类似于richtext。

另一种方法 - 但是这需要你的程序随每个文件一起提供剪贴板内容已被复制到 - 将一个OLE对象实例放在剪贴板中;接收程序,如果它理解OLE可以嵌入你的程序来显示复合数据结构。

但是,如果你想做的唯一事情就是一次只复制一个图像而只复制一个位图,那么你几乎搞砸了,因为剪贴板根本无法做到。当您选择包含图像的文本时,它通常会被复制为超文本/富文本。

答案 1 :(得分:2)

如果您询问如何将图像和字符串放到剪贴板上,这样如果您粘贴到Microsoft Word中,那么两者都会出现,您几乎肯定希望以RTF格式将数据放在剪贴板上。

我不能随意找到一个使用CF_RTF在低级别执行此操作的代码示例。更简单的高级方法是使用您想要的内容填充不可见的Rich Text控件,选择它并触发副本。我个人会用Qt来做这件事:

http://doc.qt.nokia.com/latest/qtextedit.html#copy

您可以注册自定义格式......

http://msdn.microsoft.com/en-us/library/ms649013(v=vs.85).aspx#_win32_Registered_Clipboard_Formats

...但是除非他们被重新编译以考虑您的新格式,否则没有其他程序能够解释图像/文本组合。这首先破坏了使用剪贴板的重点。虽然你可以为RenderFormat提供方法,但它会在位图类程序中粘贴为位图,在文本类程序中粘贴为文本。

你的问题的措辞是你明确地提到过程,我很困惑你可能正在使用剪贴板 - 概念上属于用户 - 在合作程序之间移动任意数据。还有其他方法可以做到这一点,比如共享内存:

http://msdn.microsoft.com/en-us/library/aa366551(v=vs.85).aspx

(注意:如果你觉得自己真的很傻并且已经编写了两个程序并且不想注册格式......你可以将Bit64编码为字符串,然后将其粘贴在一起用来制作单个字符串的文本。然后将其拆分并在接收端解码。)

答案 2 :(得分:0)

答案取决于你粘贴的位置,以及你想要粘贴的内容。

如果您需要粘贴带有文字标签的图片,那么+1代表RTF。这是非常简单的基于文本的格式:如果您只需要一行文字和一个小图像,那么您应该能够构建它,例如使用十几个CStringA :: AppendFormat调用(不要忘记将非ASCII字符编码为“\ uXXXX”)。我通常使用Windows内置的“Wordpad”应用程序来创建和格式化文档,然后我使用那个微小的RTF作为模板从我自己的数据创建RTF(Microsoft Word保存更大和更复杂的RTF文档)。 Wikipedia表示RTF支持8种图像格式,包括jpeg和png。

但是如果你需要粘贴2个文件(一个是另一个文件,例如jpeg),那么你应该先将它们写入硬盘,或者你应该搞乱shell数据对象,实现IDataObject和IAsyncOperation接口,等等。

答案 3 :(得分:0)

你绝对可以做到这一点。像往常一样将位图复制到剪贴板。然后在不清除剪贴板的情况下,再次调用SetClipboardData将文本放在那里。你现在有一个“frankenstein”剪贴板,可以粘贴为文本或位图,以获得任何格式的数据。 大约10年前,我有一个有趣的情况,一个非常流行的HTML编辑器在复制数据时无法清除剪贴板(根本没有)。因此,如果你以前复制了一个位图,然后开始使用这个编辑器,并且你粘贴到其他应用程序中,你会得到完全不同的结果,这取决于你是否粘贴到基于文本的应用程序(如记事本),图形程序(如油漆),或任何可能的方式(如Word)。

答案 4 :(得分:-1)

您可以使用CF_DIB将图像放在剪贴板上。当您需要接收数据时,请使用CF_TEXT或CF_DIB格式。