剪贴板复制粘贴的数据附带乱码,求解决.

milaoshu1020 2018-08-05 03:27:13
复制/粘贴/剪切的代码如下:
void CEgclipDlg::OnClickedButtonSet()
{
UpdateData(TRUE);
LPSTR pBuffer = NULL;
if (!(pBuffer = (LPSTR)GlobalAlloc(GMEM_DDESHARE, 100 * sizeof(TCHAR)))) {
return;
}
if (!OpenClipboard()) {
MessageBox(_T("调用OpenClipboard函数打开剪切板时发生错误."), _T("错误"));
return;
}
EmptyClipboard();
strcpy_s(pBuffer, 100 * sizeof(TCHAR), (LPCSTR)(LPCTSTR)m_szSource);
if (SetClipboardData(CF_TEXT, pBuffer)) {
MessageBox(m_szSource, _T("复制内容"));
}
else {
MessageBox(_T("复制失败."));
}
CloseClipboard();
}


void CEgclipDlg::OnClickedButtonGet()
{
if (!OpenClipboard()) {
MessageBox(_T("调用OpenClipboard函数打开剪切板时发生错误."), _T("错误"));
return;
}
HGLOBAL hGlobal = GetClipboardData(CF_TEXT);
LPTSTR pBuffer = (LPTSTR)GlobalLock(hGlobal);
m_szDestion.Format(_T("%s"), pBuffer);
GlobalUnlock(hGlobal);
UpdateData(FALSE);
CloseClipboard();
}


void CEgclipDlg::OnClickedButtonCut()
{
UpdateData(TRUE);
LPSTR pBuffer = NULL;
if (!(pBuffer = (LPSTR)GlobalAlloc(GMEM_DDESHARE, 100 * sizeof(TCHAR)))) {
return;
}
if (!OpenClipboard()) {
MessageBox(_T("调用OpenClipboard函数打开剪切板时发生错误."), _T("错误"));
return;
}
EmptyClipboard();
strcpy_s(pBuffer, 100 * sizeof(TCHAR), (LPCSTR)(LPCTSTR)m_szSource);
CString szContent = m_szSource;
m_szSource = "";
UpdateData(FALSE);
if (SetClipboardData(CF_TEXT, pBuffer)) {
MessageBox(szContent, _T("复制内容"));
}
else {
MessageBox(_T("复制失败."));
}
CloseClipboard();
}

如果全都是中文数据的话,后边有乱码;
如果全都是英文数据的话,除了第一个字母全都是乱码;
请问如何解决?
...全文
1613 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
milaoshu1020 2018-08-06
  • 打赏
  • 举报
回复
非常感谢,照二位的提示和代码修改后,运行没有问题了:
void CEgclipDlg::OnClickedButtonSet()
{
UpdateData(TRUE);
LPSTR pBuffer = NULL;
LPCTSTR pSource = (LPCTSTR)m_szSource;
size_t nLen = (_tcslen(pSource) + 1) * sizeof(TCHAR);
if (!(pBuffer = (LPSTR)GlobalAlloc(GMEM_DDESHARE, nLen))) {
return;
}
if (!OpenClipboard()) {
MessageBox(_T("调用OpenClipboard函数打开剪切板时发生错误."), _T("错误"));
return;
}
EmptyClipboard();
//strcpy_s(pBuffer, nLen, (LPCSTR)(LPCTSTR)m_szSource);
memcpy(pBuffer, pSource, nLen);
if (SetClipboardData(CF_UNICODETEXT, pBuffer)) {
MessageBox(m_szSource, _T("复制内容"));
}
else {
MessageBox(_T("复制失败."));
}
}


void CEgclipDlg::OnClickedButtonGet()
{
if (!OpenClipboard()) {
MessageBox(_T("调用OpenClipboard函数打开剪切板时发生错误."), _T("错误"));
return;
}
HGLOBAL hGlobal = GetClipboardData(CF_UNICODETEXT);
LPTSTR pBuffer = (LPTSTR)GlobalLock(hGlobal);
m_szDestion.Format(_T("%s"), pBuffer);
GlobalUnlock(hGlobal);
UpdateData(FALSE);
CloseClipboard();
}


void CEgclipDlg::OnClickedButtonCut()
{
UpdateData(TRUE);
LPSTR pBuffer = NULL;
LPCTSTR pSource = (LPCTSTR)m_szSource;
size_t nLen = (_tcslen(pSource) + 1) * sizeof(TCHAR);
if (!(pBuffer = (LPSTR)GlobalAlloc(GMEM_DDESHARE, nLen))) {
return;
}
if (!OpenClipboard()) {
MessageBox(_T("调用OpenClipboard函数打开剪切板时发生错误."), _T("错误"));
return;
}
EmptyClipboard();
memcpy(pBuffer, pSource, nLen);
CString szContent = m_szSource;
m_szSource = "";
UpdateData(FALSE);
if (SetClipboardData(CF_UNICODETEXT, pBuffer)) {
MessageBox(szContent, _T("复制内容"));
}
else {
MessageBox(_T("复制失败."));
}
CloseClipboard();
}

zgl7903 2018-08-06
  • 打赏
  • 举报
回复

int GetClipTextData(CString &szStringData)
{
szStringData.Empty();

if(OpenClipboard(NULL))
{
#if (defined _UNICODE || defined UNICODE)
DWORD uFormat = CF_UNICODETEXT;
#else
DWORD uFormat = CF_TEXT;
#endif //

HGLOBAL hClipData = GetClipboardData(uFormat);
if(hClipData != NULL)
{
LPCTSTR szSrc = (LPCTSTR)GlobalLock(hClipData);
szStringData = szSrc;

GlobalUnlock(hClipData);
}
CloseClipboard();
}

return szStringData.GetLength();
}

milaoshu1020 2018-08-06
  • 打赏
  • 举报
回复
引用 8 楼 zgl7903 的回复:

BOOL CopyTextToClipBoard(LPCTSTR szStringData)
{
BOOL bRet = FALSE;

size_t tBytesLen = (_tcslen(szStringData) + 1) * sizeof(TCHAR); //数据字节长度
LPTSTR hglbCopy = (LPTSTR)GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE | GMEM_ZEROINIT, tBytesLen); //分配内存
if(hglbCopy != NULL)
{
LPTSTR lpszDst = (LPTSTR)GlobalLock(hglbCopy); //锁定内存
memcpy(lpszDst, szStringData, tBytesLen); //拷贝数据
GlobalUnlock(hglbCopy); //解锁内存

// Place the handle on the clipboard.
if(OpenClipboard(NULL))
{
EmptyClipboard();

#if (defined _UNICODE || defined UNICODE)
SetClipboardData(CF_UNICODETEXT, hglbCopy);
#else
SetClipboardData(CF_TEXT, hglbCopy);
#endif

CloseClipboard();

bRet = TRUE;
}
}

return bRet;
}


谢谢,这个是复制的,有没有粘贴的代码呢?
milaoshu1020 2018-08-06
  • 打赏
  • 举报
回复
引用 7 楼 schlafenhamster 的回复:
strcpy_s(pBuffer, 100 * sizeof(TCHAR), (LPCSTR)(LPCTSTR)m_szSource);
为什么 是 100 ? 应该是 m_szSource 长度 !
另外· 注意 字符串 结束 符 (0 ,00)

好的,我试试.
zgl7903 2018-08-06
  • 打赏
  • 举报
回复

BOOL CopyTextToClipBoard(LPCTSTR szStringData)
{
BOOL bRet = FALSE;

size_t tBytesLen = (_tcslen(szStringData) + 1) * sizeof(TCHAR); //数据字节长度
LPTSTR hglbCopy = (LPTSTR)GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE | GMEM_ZEROINIT, tBytesLen); //分配内存
if(hglbCopy != NULL)
{
LPTSTR lpszDst = (LPTSTR)GlobalLock(hglbCopy); //锁定内存
memcpy(lpszDst, szStringData, tBytesLen); //拷贝数据
GlobalUnlock(hglbCopy); //解锁内存

// Place the handle on the clipboard.
if(OpenClipboard(NULL))
{
EmptyClipboard();

#if (defined _UNICODE || defined UNICODE)
SetClipboardData(CF_UNICODETEXT, hglbCopy);
#else
SetClipboardData(CF_TEXT, hglbCopy);
#endif

CloseClipboard();

bRet = TRUE;
}
}

return bRet;
}

schlafenhamster 2018-08-05
  • 打赏
  • 举报
回复
strcpy_s(pBuffer, 100 * sizeof(TCHAR), (LPCSTR)(LPCTSTR)m_szSource);
为什么 是 100 ? 应该是 m_szSource 长度 !
另外· 注意 字符串 结束 符 (0 ,00)
milaoshu1020 2018-08-05
  • 打赏
  • 举报
回复

void CEgclipDlg::OnClickedButtonSet()
{
UpdateData(TRUE);
LPSTR pBuffer = NULL;
if (!(pBuffer = (LPSTR)GlobalAlloc(GMEM_DDESHARE, 100 * sizeof(TCHAR)))) {
return;
}
if (!OpenClipboard()) {
MessageBox(_T("调用OpenClipboard函数打开剪切板时发生错误."), _T("错误"));
return;
}
EmptyClipboard();
strcpy_s(pBuffer, 100 * sizeof(TCHAR), (LPCSTR)(LPCTSTR)m_szSource);
if (SetClipboardData(CF_UNICODETEXT, pBuffer)) {
MessageBox(m_szSource, _T("复制内容"));
}
else {
MessageBox(_T("复制失败."));
}
}


void CEgclipDlg::OnClickedButtonGet()
{
if (!OpenClipboard()) {
MessageBox(_T("调用OpenClipboard函数打开剪切板时发生错误."), _T("错误"));
return;
}
HGLOBAL hGlobal = GetClipboardData(CF_UNICODETEXT);
LPTSTR pBuffer = (LPTSTR)GlobalLock(hGlobal);
m_szDestion.Format(_T("%s"), pBuffer);
GlobalUnlock(hGlobal);
UpdateData(FALSE);
CloseClipboard();
}


void CEgclipDlg::OnClickedButtonCut()
{
UpdateData(TRUE);
LPSTR pBuffer = NULL;
if (!(pBuffer = (LPSTR)GlobalAlloc(GMEM_DDESHARE, 100 * sizeof(TCHAR)))) {
return;
}
if (!OpenClipboard()) {
MessageBox(_T("调用OpenClipboard函数打开剪切板时发生错误."), _T("错误"));
return;
}
EmptyClipboard();
strcpy_s(pBuffer, 100 * sizeof(TCHAR), (LPCSTR)(LPCTSTR)m_szSource);
CString szContent = m_szSource;
m_szSource = "";
UpdateData(FALSE);
if (SetClipboardData(CF_UNICODETEXT, pBuffer)) {
MessageBox(szContent, _T("复制内容"));
}
else {
MessageBox(_T("复制失败."));
}
CloseClipboard();
}

改好了,后边还是有乱码:
schlafenhamster 2018-08-05
  • 打赏
  • 举报
回复
怎么程序中 还有 CF_TEXT !
milaoshu1020 2018-08-05
  • 打赏
  • 举报
回复
void CEgclipDlg::OnClickedButtonSet()
{
UpdateData(TRUE);
LPSTR pBuffer = NULL;
if (!(pBuffer = (LPSTR)GlobalAlloc(GMEM_DDESHARE, 100 * sizeof(TCHAR)))) {
return;
}
if (!OpenClipboard()) {
MessageBox(_T("调用OpenClipboard函数打开剪切板时发生错误."), _T("错误"));
return;
}
EmptyClipboard();
strcpy_s(pBuffer, 100 * sizeof(TCHAR), (LPCSTR)(LPCTSTR)m_szSource);
if (SetClipboardData(CF_UNICODETEXT, pBuffer)) {
MessageBox(m_szSource, _T("复制内容"));
}
else {
MessageBox(_T("复制失败."));
}
}


void CEgclipDlg::OnClickedButtonGet()
{
if (!OpenClipboard()) {
MessageBox(_T("调用OpenClipboard函数打开剪切板时发生错误."), _T("错误"));
return;
}
HGLOBAL hGlobal = GetClipboardData(CF_TEXT);
LPTSTR pBuffer = (LPTSTR)GlobalLock(hGlobal);
m_szDestion.Format(_T("%s"), pBuffer);
GlobalUnlock(hGlobal);
UpdateData(FALSE);
CloseClipboard();
}


void CEgclipDlg::OnClickedButtonCut()
{
UpdateData(TRUE);
LPSTR pBuffer = NULL;
if (!(pBuffer = (LPSTR)GlobalAlloc(GMEM_DDESHARE, 100 * sizeof(TCHAR)))) {
return;
}
if (!OpenClipboard()) {
MessageBox(_T("调用OpenClipboard函数打开剪切板时发生错误."), _T("错误"));
return;
}
EmptyClipboard();
strcpy_s(pBuffer, 100 * sizeof(TCHAR), (LPCSTR)(LPCTSTR)m_szSource);
CString szContent = m_szSource;
m_szSource = "";
UpdateData(FALSE);
if (SetClipboardData(CF_UNICODETEXT, pBuffer)) {
MessageBox(szContent, _T("复制内容"));
}
else {
MessageBox(_T("复制失败."));
}
CloseClipboard();
}

直接改的话,变成NULL了,不知为什么?
milaoshu1020 2018-08-05
  • 打赏
  • 举报
回复
引用 2 楼 schlafenhamster 的回复:
CF_UNICODETEXT ?

好的,我试试...
schlafenhamster 2018-08-05
  • 打赏
  • 举报
回复
CF_UNICODETEXT ?
milaoshu1020 2018-08-05
  • 打赏
  • 举报
回复
补充:
操作系统是Win7.
开发平台是VS2017社区版.

15,977

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧