c++ - 在 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);
}
任何帮助表示赞赏。
解决方案
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;
}
推荐阅读
- api - 如何以编程方式更改分配给任务的用户?
- arrays - 如何像在 Python 中一样在 Julia 中拆分数组?
- javascript - 选择某个单选按钮时需要在表单上进行某些输入
- python - 如何单击元素列表中的元素
- 和
- 使用python的硒元素?
- php - 嵌套:QueryParsingException[[multi_match] 查询不支持 [fields]];
- javascript - Array.prototype.find() 与 IE11
- bash - 按子文件夹编号排序目录列表
- sql - 在 shell 脚本中运行选择时 DB2 服务器连接丢失
- angularjs - 如何在目标文件中选择特定选项卡
- amazon-web-services - 我们可以直接将 ec2 实例从私有子网移动到公有子网吗?