我不知道为什么此代码不能正常工作:复制unicode字符串到剪贴板不工作
#define UNICODE
#include <iostream>
#include <sstream>
#include <windows.h>
void main(void)
{
wchar_t* strData = L"CreateWindowExA";
MessageBox(NULL, strData, L"Warning", MB_OK);
if (OpenClipboard(0)) {
EmptyClipboard();
HGLOBAL hClipboardData;
hClipboardData = GlobalAlloc(GMEM_DDESHARE,
wcslen(strData) + 1);
char* pchData;
pchData = (char*)GlobalLock(hClipboardData);
strcpy(pchData, LPCSTR(strData));
GlobalUnlock(hClipboardData);
SetClipboardData(CF_TEXT, hClipboardData);
CloseClipboard();
}
MessageBox(NULL, L"Copied to Clipboard", L"Title", MB_OK);
}
指定'GlobalAlloc'分配的数量的参数分配**字节数**,而不是字符数(在你的情况下是2个字节宽)。你需要弄清楚要分配多少个字节。其次,您不需要将宽字符串转换为ANSI字符串,反之亦然。那('LPCSTR)'演员阵容不会奏效。如果你在代码的其他部分做了类似的事情,那么你不会向我们展示,那么就停止这样做,因为你的程序将注定失败。 – PaulMcKenzie
“SetClipboardData()”的返回值是什么? DId你在下面看到我的评论并链接到API文档?如果您使用NULL窗口句柄,请尝试跳过EmptyClipboard()。 –
你似乎并不被阅[文件]大风扇(https://msdn.microsoft.com/en-us/library/windows/desktop/aa366574.aspx):*“下面的值是过时的,但提供与16位Windows兼容** **忽略**'GMEM_DDESHARE' [*]“*。此外,在你的代码中几乎没有错误检查。为什么我们必须猜测,哪个API调用失败?应仅在可移动内存上调用'GlobalLock'(当您请求固定内存时)。它用于将句柄转换为指针,但您已将其传递给有效的内存指针。不好。 – IInspectable