将文本复制到 MFC 中的剪贴板
Copy text to Clipboard in MFC
我试图制作一种快速方法来在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以获取详细说明。
相关文章:
- C++剪贴板队列粘贴随机结果?
- 将缓冲区复制到剪贴板 [换行错误]
- wxWidgets mac剪贴板在3.1.3上坏了?
- 获取剪贴板数据(CF_HDROP)在剪切和粘贴中失败
- 在 UWP 中找不到剪贴板
- 剪贴板数据上使用的全局大小函数会导致错误
- 将矢量复制到剪贴板
- 通过EventFilter到剪贴板获取QlineEdit的某些属性
- 如何使用OlesetClipboard将我的COM对象放置在剪贴板上时解决问题
- 使用 WIC 阅读剪贴板
- 文本到剪贴板
- 在QT应用程序和Windows Explorer之间剪切和粘贴剪贴板交换
- Linux/C++ 将字符串复制到剪贴板
- 从表视图复制到剪贴板
- 在可以选择剪贴板副本时,如何禁用Ccombobox
- 无法将 HTML 格式的 unicode(wchar_t 使用)复制到剪贴板
- BitBlt从剪贴板复制位图会给出错误的颜色
- 将文本复制到 MFC 中的剪贴板
- 如何在程序或网站处于活动状态时禁用剪贴板和任务切换操作
- 如何仅使用直接 WinAPI 将独立于设备的位图放入 Windows 剪贴板?(无 MFC 或其他包装器)