|
最近在看孙鑫的MFC视频,看到进程通信时候出了个问题,setclipboarddata();然后粘贴只能粘贴第一个字符,比如“123456789”,只能复制1.代码也很简单,就是从cedit读取数据然后粘贴,原本打算用char*,但是strcpy(char*,cstring)函数在vs2017不能用,然后改成TCHAR,我看了一眼内存,pdatsbuff指向的空间所有字符串已经被复制了,只能赋值第一个字节想不通,
CString str;
GetDlgItemText(IDC_EDIT1_send, str);
TCHAR * pStrData = str.GetBuffer(0);
str.ReleaseBuffer();
if (OpenClipboard())
{
TCHAR * pDataBuf;
HGLOBAL hGlobalClip;
hGlobalClip = GlobalAlloc(GHND, (_tcslen(pStrData) + 1) * sizeof(TCHAR)
);
pDataBuf = (TCHAR *)GlobalLock(hGlobalClip);
_tcscpy_s(pDataBuf, (_tcslen(pStrData) + 1) * sizeof(TCHAR), pStrData);
GlobalUnlock(hGlobalClip);
EmptyClipboard();
SetClipboardData(CF_TEXT, hGlobalClip);
CloseClipboard();
}
下面的代码是可以完全粘贴所有字节
CHAR* psdata = "你好";
if (OpenClipboard())
{
HANDLE hglobal = GlobalAlloc(GHND, strlen(psdata) + 1); //分配全局内存,设置内存类型,大小为字符串长度+1
char* m_pBase = nullptr;
m_pBase = (char*)GlobalLock(hglobal); //得到内存空间的首地址,加锁
strcpy_s(m_pBase, strlen(psdata) + 1, psdata); //复制字符串到地址空间中去,类似于内存映射中的操作
GlobalUnlock(hglobal);
EmptyClipboard();
SetClipboardData(CF_TEXT, hglobal);
CloseClipboard();
}
本帖最后由 cpp2019 于 2021-9-26 23:54 编辑
// 这是剪贴板操作,跟进程通信没有关系,只能说可以把它当做通信的桥梁,这种通信方式我是不推荐使用的。
- void CMFCAppDlg::OnBnClickedOk()
- {
- UINT uFormat = CF_TEXT;
- #ifdef UNICODE
- uFormat = CF_UNICODETEXT;
- #endif // UNICODE
- CString str(_T("这是要给剪贴板的内容"));
- if (OpenClipboard())
- {
- if (!EmptyClipboard())
- {
- CloseClipboard();
- return;
- }
- HGLOBAL hGlobalClip = GlobalAlloc(GMEM_DDESHARE, (str.GetLength() + 1) * sizeof(TCHAR));
- TCHAR* pDataBuf = (TCHAR *)GlobalLock(hGlobalClip);
- _tcscpy_s(pDataBuf, (str.GetLength() + 1) * sizeof(TCHAR), str);
- GlobalUnlock(hGlobalClip);
- SetClipboardData(uFormat, hGlobalClip);
- CloseClipboard();
- // 打印
- OutputDebugString(pDataBuf);
- }
- }
复制代码
|
上一篇: 帮我看看程序代码哪里出错了。vs2005编译不成功下一篇: 请教下cin>>输入问题
|