【问题标题】:Getting Clipboard data in raw format in c++在 C++ 中以原始格式获取剪贴板数据
【发布时间】:2011-01-09 03:45:52
【问题描述】:

我一直在玩 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;
}

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

【问题讨论】:

    标签: c++ c winapi clipboard


    【解决方案1】:

    不涉及“原始”数据。只需enumerate all the formats currently on the clipboard,然后获取并保存每种格式的内容。但要小心自动格式转换。

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

    【讨论】:

    • @Dave18 我粘贴了到目前为止我尝试过的内容,这是我的主要问题
    • 该过程取决于格式,请参阅Standard Clipboard Formats。范围内的注册格式和私有格式(CF_GDIOBJFIRST 到 CF_GDIOBJLAST)都使用GlobalAlloc,因此您对GlobalSizeGlobalLock 的调用将适用于它们(但对GlobalLock 的调用与GlobalUnlock 匹配)。
    • 注意CF_BITMAPCF_ENHMETAFILECF_HDROP之类的格式——对于这些格式,剪贴板上的对象是HBITMAPHENHMETAFILEHDROP不是 HGLOBAL!
    • @qertymk EnumClipboardFormats 会返回currentFormat,因此您需要在阅读之前检查您是否有CF_TEXT(文本格式)的数据。我提供的链接有一个剪贴板查看器的示例。
    • @Dave18:不幸的是,该示例通过要求剪贴板所有者呈现数据来处理几乎所有格式,它实际上并不直接处理内容,除了几个特定格式。
    【解决方案2】:

    MSDN 包含使用剪贴板 API 操作剪贴板数据所需了解的所有示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-15
      • 1970-01-01
      • 1970-01-01
      • 2011-02-02
      相关资源
      最近更新 更多