我正在开发一些软件,它将一个大字符串复制到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;
}