C++ 在MFC中将文本复制到剪贴板
我尝试了一种在MFC中设置剪贴板文本的快速方法,但这不起作用C++ 在MFC中将文本复制到剪贴板,c++,mfc,C++,Mfc,我尝试了一种在MFC中设置剪贴板文本的快速方法,但这不起作用 void CopyTextToClipBoard( CString strText) { if (OpenClipboard(GetFrame()->GetSafeHwnd())) { EmptyClipboard() ; SetClipboardData (CF_TEXT, strText.GetBuffer() ) ; CloseClipboard () ;
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已生成断点…)。我会在另一台电脑上再试一次。