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

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

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

最佳答案

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

我无法随手找到一个很好的代码示例来使用 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

(注意:如果你觉得自己真的很傻并且已经编写了两个程序并且不想注册格式......你可以将位图Base64编码为字符串,然后将它与text 使您通过的单个字符串。然后将其拆分并在接收端对其进行解码。)

关于C++:如何将多个对象复制到剪贴板并在之后提取它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6001333/

相关文章:

c++ - 使用 make_shared<std::thread> 创建 shared_ptr<std::thread> 的实例

c++ - 为什么 CAF system.registry() 应该在 put(atom_value) 之后自动调用 erase(atom_value)

windows - 在 Windows 中连接到命名管道,不同的用户帐户

c++ - 在 Windows 中使用事件进行调试

c++ - 判断命令行程序是否安装C++

c - 如何设置Unicode控件的字体?

c++ - 为基于对话框的应用程序实现回调函数

c# - 如何将文件列表添加到剪贴板以进行剪切

jquery - 选择整个表格/文本以复制到剪贴板

winapi - 如何在等待另一个程序完成时更新 win32 应用程序 gui?