中文在 有的环境下剪贴板乱码
之前的代码:
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);