首页 > 解决方案 > 在 C++ 中的 SetClipboardData() 之后粘贴不包括记事本的换行符

问题描述

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

我在 C++ 中使用 CF_TEXT 剪贴板格式类型的 SetClipboardData()。我尝试过使用 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);

}

任何帮助表示赞赏。

标签: c++clipboardnotepadwordpad

解决方案


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;
}

推荐阅读