VC非ASCII语言复制到剪切板乱码问题

VC非ASCII语言复制到剪切板乱码问题


中文在 有的环境下剪贴板乱码

之前的代码:

BOOL	CopyStringToClipBoard( HWND hOwner, CString strSource )
{
	if( ::OpenClipboard(hOwner) )
	{
		HANDLE clipbuffer ;
		char *buffer ;
		::EmptyClipboard() ;
		clipbuffer = ::GlobalAlloc( GMEM_DDESHARE,strSource.GetLength()+1 ) ;
		buffer = (char*)::GlobalLock(clipbuffer) ;
		strcpy( buffer, LPCSTR(strSource) ) ;
		::GlobalUnlock(clipbuffer) ;
		::SetClipboardData(CF_TEXT, clipbuffer) ;
		::CloseClipboard() ;
	} 
	return FALSE ;
}

修改之后的代码:

BOOL	CopyStringToClipBoard( HWND hOwner, CString strSource )
{
	if( ::OpenClipboard(hOwner) )
	{
		int buff_size = strSource.GetLength() ;
		CStringW strWide = CStringW(strSource);
		int nLen = strWide.GetLength();
		HANDLE clipbuffer ;
		char* buffer;
		::EmptyClipboard() ;
		clipbuffer = ::GlobalAlloc( GMEM_DDESHARE, (nLen + 1) * 2 ) ;
		buffer = (char*)::GlobalLock(clipbuffer) ;
		memset(buffer, 0, (nLen + 1) * 2);
		memcpy_s(buffer, nLen * 2, strWide.GetBuffer(0), nLen* 2 );
		strWide.ReleaseBuffer();
		::GlobalUnlock(clipbuffer) ;
		::SetClipboardData(CF_UNICODETEXT, clipbuffer) ;
		::CloseClipboard() ;
	} 
	return FALSE ;
}

//--------------------------------------------------------------------------------------------------------或者
		HGLOBAL clipbuffer; 
		wchar_t * buffer; 
		EmptyClipboard(); 
		clipbuffer = GlobalAlloc (GHND | GMEM_SHARE, (source.GetLength() + 1)*sizeof(wchar_t)) ;
		buffer       = (wchar_t*)GlobalLock(clipbuffer); 
		wcscpy(buffer, /*W2A*/(source)); 
		GlobalUnlock(clipbuffer); 
		SetClipboardData(CF_UNICODETEXT,clipbuffer); 
		CloseClipboard(); 
		GlobalFree(clipbuffer);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值