将字符串复制到剪贴板,粘贴时只写入一个字符

时间:2010-02-15 10:54:27

标签: winapi

我是code的基本代码,在我的其他question中也有提及。该版本强制将字符类型设置为char*,这会破坏我的unicode项目的编译。所以我做了以下调整:

void SetClipboardText(CString & szData)
{
    HGLOBAL h;
    LPTSTR arr;

    size_t bytes = (szData.GetLength()+1)*sizeof(TCHAR);
    h=GlobalAlloc(GMEM_MOVEABLE, bytes);
    arr=(LPTSTR)GlobalLock(h);
    ZeroMemory(arr,bytes);
    _tcscpy_s(arr, szData.GetLength()+1, szData);
    szData.ReleaseBuffer();
    GlobalUnlock(h);

    ::OpenClipboard (NULL);
    EmptyClipboard();
    SetClipboardData(CF_TEXT, h);
    CloseClipboard();
}

复制看起来很好 - 在调试器中运行Visual Studio告诉我arr包含复制的字符串。 但是当我粘贴到任何应用程序时,只粘贴第一个字符。

出了什么问题?

1 个答案:

答案 0 :(得分:5)

先前问题评论中的Unicode评论很有说服力。如果您有一个带有低ASCII字符的宽字符串,则在UTF-16中,它将被编码为低ASCII字节,后跟NULL。 Use CF_UNICODETEXT instead of CF_TEXT