Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在MFC中将文本复制到剪贴板_C++_Mfc - Fatal编程技术网

C++ 在MFC中将文本复制到剪贴板

C++ 在MFC中将文本复制到剪贴板,c++,mfc,C++,Mfc,我尝试了一种在MFC中设置剪贴板文本的快速方法,但这不起作用 void CopyTextToClipBoard( CString strText) { if (OpenClipboard(GetFrame()->GetSafeHwnd())) { EmptyClipboard() ; SetClipboardData (CF_TEXT, strText.GetBuffer() ) ; CloseClipboard () ;

我尝试了一种在MFC中设置剪贴板文本的快速方法,但这不起作用

void CopyTextToClipBoard( CString strText)
{
    if (OpenClipboard(GetFrame()->GetSafeHwnd()))
    {
        EmptyClipboard() ;  
        SetClipboardData (CF_TEXT, strText.GetBuffer() ) ;
        CloseClipboard () ;
    }
}
我在“setClipboardData”处遇到“Windows断点”错误。有人知道我可能做错了什么吗

编辑:谢谢你的评论。改装的。现在它在:memcopy函数处失败

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
的第二个参数是全局内存块的句柄


有关详细说明。

来自的MSDN文档

如果hMem参数标识内存对象,则该对象必须具有 已使用带有GMEM\u 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();
    }
}
void CopyToClipboard(HWND所有者,const std::wstring&w)
{
如果(打开剪贴板(所有者))
{
HGLOBAL hgClipBuffer=nullptr;
std::size\u t sizeInWords=w.size()+1;
std::size\u t sizeInBytes=sizeInWords*sizeof(wchar\u t);
hgClipBuffer=全球平均值(GHND | GMEM | U份额,大小单位);
如果(!hgClipBuffer)
{
CloseClipboard();
返回;
}
wchar_t*wgClipBoardBuffer=static_cast(GlobalLock(hgClipBuffer));
wcscpy_s(wgClipBoardBuffer,sizeInWords,w.c_str());
GlobalUnlock(hgClipBuffer);
清空电路板();
SetClipboardData(CF_unicodext,hgClipBuffer);
CloseClipboard();
}
}

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

您从哪里得到第二个参数是字符串的信息?您应该使用strText.GetBuffer()而不是&strText。不要忘了在memcpy之后的字符串末尾添加null终止符。谢谢。hglbCopy设置正确,但在我的电脑上SetClipboardData()时失败。@Matt Fomich它在我的电脑上运行正常。当你说失败时,这是运行时错误吗?它是调试模式下调试器中的断点(错误--Windows已生成断点…)。我会在另一台电脑上再试一次。