在 C++ 中的 SetClipboardData() 之后粘贴不包括记事本的换行符



我正在开发一些软件,它将一个大字符串复制到Windows剪贴板以粘贴到其他软件中。 粘贴到其他软件中不起作用,当我粘贴到记事本中时,初始字符串中的换行符消失了,这就是它无法粘贴到其他软件中的原因。 我知道这一点,因为当我将换行符重新添加到记事本并进行复制时,粘贴然后在另一个程序中工作。 当我粘贴到写字板中时,换行符神秘地存在。

我正在使用 SetClipboardData(( C++与CF_TEXT剪贴板格式类型。 我试过使用CF_OEMTEXT,CF_DSPTEXT但这些都不起作用。 我看到了一些关于电子表格CF_SYLK(符号链接(的文档,因为我粘贴的软件类似于电子表格,但我也无法让它工作。 下面是我复制到剪贴板的代码。

void ClipBoardManager::CopyExcelStringToClipBoard(std::string excel_str)
{
    OpenClipboard(nullptr);
    EmptyClipboard();
    HGLOBAL hg = GlobalAlloc(GMEM_MOVEABLE, excel_str.size() + 1);
    if (!hg) {
        CloseClipboard();
        return;
    }
    memcpy(GlobalLock(hg), excel_str.c_str(), excel_str.size() + 1);
    GlobalUnlock(hg);
    SetClipboardData(CF_TEXT, hg);
    CloseClipboard();
    GlobalFree(hg);
}

任何帮助,不胜感激。

excel_str必须具有 CRLF 行尾。以下是将字符串转换为良好格式的示例代码:

string replaceAll(string in, string replaceIn, string replaceOut)
{
    size_t pos = 0;
    while(pos < in.size())
    {
        size_t pos2 = in.find(replaceIn, pos);
        if(pos2 != string::npos)
        {
            in.replace(in.begin() + pos2, in.begin() + pos2 + replaceIn.size(), replaceOut);
            pos = pos2 + replaceOut.size();
        }
        else
            break;
    }
    return in;
}

如果您的项目设置 unicode 字符(默认设置( - 在任何地方使用 unicode 并使用 CF_UNICODETEXT 而不是CF_TEXT。或者使用非 unicode - 但始终如一 - 然后更改项目设置。下面的代码将正确复制带有行尾的文本 - 在此程序结束后,可以从记事本的剪贴板粘贴此程序复制的文本(带有行尾(:

#include <Windows.h>
BOOL WINAPI ToClipboard(VOID);
int main()
{
    ToClipboard();
}
BOOL WINAPI ToClipboard(VOID)
{
  LPTSTR  lptstrCopy;
  HGLOBAL hglbCopy;
  if (!OpenClipboard(NULL))
      return FALSE;
  EmptyClipboard();
  // Allocate a global memory object for the text. 
  wchar_t s[] = L"12345n6789";
  hglbCopy = GlobalAlloc(GMEM_MOVEABLE,
      (wcslen(s) + 1) * sizeof(wchar_t));
  if (hglbCopy == NULL)
  {
      CloseClipboard();
      return FALSE;
  }
  lptstrCopy = (LPTSTR)GlobalLock(hglbCopy);
  memcpy(lptstrCopy, &s,
    (wcslen(s) + 1) * sizeof(wchar_t));
  lptstrCopy[sizeof(s)] = (TCHAR)0;    // null character 
  GlobalUnlock(hglbCopy);
  SetClipboardData(CF_UNICODETEXT, hglbCopy);
  CloseClipboard();
  return TRUE;
}

最新更新