在 C++ 中获取原始格式的剪贴板数据

qwe*_*ymk 4 c c++ clipboard winapi

我一直在玩Windows剪贴板。我注意到,如果您提供格式,则只能查看剪贴板。我见过可以转储剪贴板原始内容的程序。请参阅http://www.autohotkey.com/docs/misc/Clipboard.htm#ClipboardAll作为我的意思的示例。

有没有办法做类似的事情,我想做的是能够备份剪贴板,操作它,然后在我的程序完成时恢复它。

我正在寻找一个非.net 解决方案(如果这确实是一件事)

编辑:

到目前为止我尝试过:

struct clipData {
 vector<void*> data;
 vector<int> size;
};

struct clipData saveClipboard(int &size) {
 clipData ret;
 UINT currentFormat = 0;
 HGLOBAL hData;
 if (OpenClipboard(0)) {

  while(currentFormat = EnumClipboardFormats(currentFormat)) {
   hData = GetClipboardData(currentFormat);
   int currentClipboardFormatSize = GlobalSize(hData); //Only works with text formats. Help!
   char *savedClipboardData = new char[currentClipboardFormatSize];
   char *ptrToData = (char*) GlobalLock(hData);
   memcpy(savedClipboardData, ptrToData, currentClipboardFormatSize);
   ret.data.push_back(savedClipboardData);
   ret.size.push_back(currentClipboardFormatSize);
   }
  CloseClipboard();
 }
 return ret;
}
Run Code Online (Sandbox Code Playgroud)

但问题是没有办法知道每种格式的剪贴板有多大

Ben*_*igt 6

不涉及“原始”数据。只需枚举当前剪贴板上的所有格式,然后获取并保存每种格式的内容即可。但要小心自动格式转换。

如果您仔细阅读链接的自动热键文档,它甚至会告诉您它正在单独检索每种格式,并且它可能只能成功检索格式的子集。

  • 请注意“CF_BITMAP”、“CF_ENHMETAFILE”和“CF_HDROP”等格式——对于这些格式,剪贴板上的对象是“HBITMAP”、“HENHMETAFILE”或“HDROP”,*不是*“HGLOBAL”! (6认同)
  • 该过程取决于格式,请参阅[标准剪贴板格式](http://msdn.microsoft.com/en-us/library/ff729168.aspx)。范围内的注册格式和私有格式(CF_GDIOBJFIRST 到 CF_GDIOBJLAST)都使用“GlobalAlloc”,因此对“GlobalSize”和“GlobalLock”的调用对它们来说可以正常工作(但必须将“GlobalLock”的调用与“GlobalUnlock”相匹配)。 (3认同)