将文本复制到 MFC 中的剪贴板

Copy text to Clipboard in MFC

本文关键字:剪贴板 MFC 文本 复制      更新时间:2023-10-16

我试图制作一种快速方法来在MFC中设置剪贴板文本,但这不起作用。

void CopyTextToClipBoard( CString strText)
{
    if (OpenClipboard(GetFrame()->GetSafeHwnd()))
    {
        EmptyClipboard() ;  
        SetClipboardData (CF_TEXT, strText.GetBuffer() ) ;
        CloseClipboard () ;
    }
}

我在"setClipboardData"收到"Windows断点"错误。 有谁知道我可能做错了什么?

编辑:感谢您的评论。修改。现在它在以下方面失败:内存复制功能。

void CopyTextToClipBoard( CString strText)
{
if (OpenClipboard(GetFrame()->GetSafeHwnd()))
{
    HGLOBAL hglbCopy;
      LPTSTR  lptstrCopy;
    hglbCopy = GlobalAlloc(GMEM_MOVEABLE, (strText.GetLength() + 1) * sizeof(TCHAR)); 
    if (hglbCopy == NULL) 
    { 
        CloseClipboard(); 
        return ; 
    } 
    memcpy(GlobalLock(hglbCopy), &strText, strText.GetLength() + 1 * sizeof(TCHAR));      
    GlobalUnlock(hglbCopy);  
    SetClipboardData(CF_TEXT, hglbCopy); 
    EmptyClipboard() ;    
    SetClipboardData (CF_TEXT, strText.GetBuffer() ) ;
    CloseClipboard () ;
    }
}

编辑:使用此旧的 msdn 示例。

const char* output = "Test";
const size_t len = strlen(output) + 1;
HGLOBAL hMem =  GlobalAlloc(GMEM_MOVEABLE, len);
memcpy(GlobalLock(hMem), output, len);
GlobalUnlock(hMem);
OpenClipboard(0);
EmptyClipboard();
SetClipboardData(CF_TEXT, hMem);
CloseClipboard();

来自 SetClipboardData(uFormat,hMem) 的 MSDN 文档

如果 hMem 参数标识内存对象,则该对象必须具有 使用带有 GMEM_MOVEABLE 标志的函数分配

你可以这样做:

     LPTSTR  lptstrCopy; 
     HGLOBAL hglbCopy; 
     unsigned int strSize=strText.GetLength();//get your string lenght
     hglbCopy = GlobalAlloc(GMEM_MOVEABLE, (strSize+1) * sizeof(TCHAR));//allocate the memory object with GMEM_MOVEABLE 
     if (hglbCopy == NULL) 
     { 
          CloseClipboard(); 
          //other error handling
     }
     lptstrCopy = (LPTSTR)GlobalLock(hglbCopy); 
     memcpy(lptstrCopy, strText.GetBuffer(), strSize * sizeof(TCHAR)); //copy the text data
     lptstrCopy[strSize] = (TCHAR) 0;//the null terminator
     GlobalUnlock(hglbCopy); 
    EmptyClipboard() ;  
    SetClipboardData (CF_TEXT,hglbCopy);
    CloseClipboard () ;
这是一个

有效的 - unicode。

void CopyToClipboard(HWND owner, const std::wstring &w)
{
    if (OpenClipboard(owner))
    {
        HGLOBAL hgClipBuffer = nullptr;
        std::size_t sizeInWords = w.size() + 1;
        std::size_t sizeInBytes = sizeInWords * sizeof(wchar_t);
        hgClipBuffer = GlobalAlloc(GHND | GMEM_SHARE, sizeInBytes);
        if (!hgClipBuffer)
        {
            CloseClipboard();
            return;
        }
        wchar_t *wgClipBoardBuffer = static_cast<wchar_t*>(GlobalLock(hgClipBuffer));
        wcscpy_s(wgClipBoardBuffer, sizeInWords, w.c_str());
        GlobalUnlock(hgClipBuffer);
        EmptyClipboard();
        SetClipboardData(CF_UNICODETEXT, hgClipBuffer);
        CloseClipboard();
    }
}

(应该是正确的,写在电话上)

SetClipboardData 的第二个参数是全局内存块的句柄。

看http://www.codeproject.com/Articles/2242/Using-the-Clipboard-Part-I-Transferring-Simple-Tex以获取详细说明。