hur.cn - 华软网

 热门搜索

操作剪切板进行进程通信时,传递英文字母时出现乱码!

  作者:未知    来源:网络    更新时间:2010/4/12
发送代码

void C进程通信剪切板发送端Dlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true);
if(OpenClipboard())           //打开剪切板
{
HANDLE hClip;
char* pbuf;
char* buf=(char *)(LPCTSTR )m_edit;
EmptyClipboard();           //清空剪切板内容
hClip=GlobalAlloc(GMEM_MOVEABLE,m_edit.GetLength()*2+2);          //为数据分配内存
pbuf=(char *)GlobalLock(hClip);                     //锁定内存块,并把句柄转换为指针
strcpy(pbuf,buf);          //放置即将传送的数据
GlobalUnlock(hClip);                                //解除锁定
SetClipboardData(CF_TEXT,hClip);          //把数据放入剪切板中
CloseClipboard();       //关闭剪切板,否则其他进程无法打开剪切板
}
else
{
MessageBox(L"打开剪切板失败");
}
}
——————————————————————


接收代码

void C进程通信剪切板接收端Dlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
if(OpenClipboard())
{
if(IsClipboardFormatAvailable(CF_TEXT))
{
HANDLE hClip;
LPCTSTR pbuf;
hClip=GetClipboardData(CF_TEXT);
pbuf=(LPCTSTR )GlobalLock(hClip);
GlobalUnlock(hClip);
m_edit=pbuf;
CloseClipboard();
}
}
else 
{
MessageBox(L"打开剪切板失败");
}
UpdateData(false);
}
——————————————————————
注意上面的hClip=GlobalAlloc(GMEM_MOVEABLE,m_edit.GetLength()*2+2);
进过测试只能是加2的时候才能正常接收中文字符;
还有就是使用因为进行传输是出现乱码:
如:发送:ddd一夕梦七夜
接收为:d*㗸+耸+聸+¸爈ⵅj쁐䀞煲耀º牲७嬈䐁牲j

---华软 网友回答---
是因为UNICODE和ANSI字符的关系,具体区别请查看相关资料(本人理解不是太深,怕误导你:)。

还是说两句吧:对于处理包含类似中英文混合的字符时,最好使用UNICODE编译选项,然后在使用字符串常量时采用_T(“字符串”)的方式,将char型改成TCHAR,相关的字符处理函数也使用UNICODE的,这些函数可以在MDSN中查到,具体位置为:generic-text mappings -> Routine Mappings。
你可以使用以下方法再试下:

C++">
void CClipboardDlg::OnBnClickedButtonPutToClipboard()
{
if(OpenClipboard()) //打开剪切板
{
HANDLE hClip;
TCHAR* pbuf;
TCHAR ContentBuf[100] = {0};
this->m_Edit_Content.GetWindowText(ContentBuf, sizeof(ContentBuf));

EmptyClipboard(); //清空剪切板内容
hClip=GlobalAlloc(GMEM_MOVEABLE,_tcslen(ContentBuf)*2+2); //为数据分配内存
pbuf=(TCHAR *)GlobalLock(hClip); //锁定内存块,并把句柄转换为指针
_tcscpy(pbuf,ContentBuf); //放置即将传送的数据
GlobalUnlock(hClip); //解除锁定
SetClipboardData(CF_UNICODETEXT,hClip); //把数据放入剪切板中
CloseClipboard(); //关闭剪切板,否则其他进程无法打开剪切板
}
else
{
MessageBox(L"打开剪切板失败");
}

}

void CClipboardDlg::OnBnClickedButtonGetFromClipboard()
{
if(OpenClipboard())
{
if(IsClipboardFormatAvailable(CF_UNICODETEXT))
{
HANDLE hClip;
TCHAR *pbuf;
hClip=GetClipboardData(CF_UNICODETEXT);
pbuf=(TCHAR *)GlobalLock(hClip);
GlobalUnlock(hClip);
this->m_Edit_Target.SetWindowText(pbuf);
CloseClipboard();
}
}
else  
{
MessageBox(L"打开剪切板失败");
}
}

---华软网友回复---
为什么要用剪贴板? 内存映射文件挺好嘛。
---华软网友回复---
引用 2 楼 mcaok 的回复:
为什么要用剪贴板? 内存映射文件挺好嘛。

内存映射文件也是用过的,只是操作剪切板的问题!
---华软网友回复---
hClip=GlobalAlloc(GMEM_MOVEABLE,m_edit.GetLength()*2+2);
进过测试只能是加2的时候才能正常接收中文字符;
知道了为什么吗?请教下      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。