有以下代码,用于将剪贴板中CF_TEXT文本粘贴到一个编辑器。void CExtraEditCtrl::Paste()
{
if(!::OpenClipboard(NULL)) return ; HANDLE hData = NULL;
SIZE_T size = 0;

if( IsClipboardFormatAvailable(CF_TEXT))
{
hData = GetClipboardData(CF_TEXT);
size = GlobalSize(hData);
if(size != 0)
{
hData = NULL;
}
}

char * buffer = NULL;
if(hData) buffer = (char*)GlobalLock(hData); CloseClipboard();
if(buffer != NULL)
{
ReplaceSel(buffer);
} if(hData) GlobalUnlock(hData);
}以上代码在中文系统运行良好,但是在英文系统经常出现文本被粘贴为乱码(比如从outlook复制出来的内容),只是经常,不是必然(原因不明)。用剪贴板查看器clipbrd.exe查看剪贴板内容,发现剪贴板中Unicode内容正常,是被复制的文本,但是CF_TEXT内容显示为“????”。请问各位达人,剪贴板内为什么会出现这种错误的内容呢?是不是和系统的某些系统设置有关系。偶的整个应用程序都不是Unicode的,所以暂时不考虑直接取Unicode数据。

解决方案 »

  1.   

    试试这段代码,把剪贴板的数据拷贝到用户程序PTSTR pGlobal,pText=0;
    HGLOBAL hGlobal; ::OpenClipboard(NULL);
    if(hGlobal = GetClipboardData(CF_TEXT) )
    {
    pGlobal = (char*)GlobalLock(hGlobal);
    if(pText)
    {
    free(pText);
    pText = NULL;
    }
    pText = (char*)malloc(GlobalSize(hGlobal));
    strcpy(pText,pGlobal);
    }

    CloseClipboard();
    if(pText)
    {
    m_edit.ReplaceSel(pText);
    } GlobalUnlock(hGlobal);
    if(pText)free(pText);
      

  2.   

    嗯,我详细看了你的代码,和我原来的代码的区别在于将数据复制了自己的buffer中。其实我的ReplaceSel是自己写的,里面已经将数据复制到了另一个buffer。现在让我迷惑的是,为什么用剪贴板查看器clipbrd.exe看到的CF_TEXT内容竟然都是乱码,如果它是空的还好理解。
      

  3.   

    先CF_UNICODETEXT读出,再W2A转换
      

  4.   

    先CF_UNICODETEXT读出,再W2A转换呵呵,我也这样想过,不过有个疑问,windows自己都转换错了,调用它的API能转换正确么。
      

  5.   

    本身CF_TEXT中就是乱码,即使在中文环境下,
    但用CF_UNICODETEXT是可以的,不知英文环境如何