在实现这个功能的过程中,我遇到了很多问题。
可能会存在以下四种情况:
1.代码不能使用
2.只能复制首字母
3.复制出来的乱码
基于以上出现的问题,大致是因为:
国内搜索到的关于剪切板的操作大多数是基于ASCII情况下的剪切板操作,包括MSDN上也是
关于两种差距对比:
//剪切板操作是win user api
#include <WinUser.h>
学习大致思路如下:
OpenClipboard //打开剪贴板
GlobalAlloc//分配内存保存要复制到剪贴板的数据
GlobalLock//内存加锁
内存操作:比如:strcpy,strncpy,memcpy_s,memset等
GlobalUnlock//内存解锁
SetClipboardData//将内存交给剪贴板管理,,复制内容到剪贴板
CloseClipboard//关闭剪贴板
ASCII
CString source("hello");
if(OpenClipboard())
{
HGLOBAL clipbuffer;
char* buffer;
EmptyClipboard();
clipbuffer = GlobalAlloc(GMEM_DDESHARE,source.GetLength()+1);
buffer = (char*)GlobalLock(clipbuffer);
strcpy(buffer,(LPSTR)(LPCTSTR)source);
GlobalUnlock(clipbuffer);
SetClipboardData(CF_TEXT,clipbuffer);
CloseClipboard();
}
Unicode
CString source("hello");
if(OpenClipboard())
{
HGLOBAL clipbuffer;
wchar_t* buffer;
int buf_szie = source.GetLength();
EmptyClipboard();
clipbuffer = GlobalAlloc(GMEM_DDESHARE,(source.GetLength()+1)*sizeof(wchar_t));
buffer = (wchar_t*)GlobalLock(clipbuffer);
memset(buffer,0,(buf_szie+1)*sizeof(wchar_t));
memcpy_s(buffer,buf_szie*sizeof(wchar_t),source.GetBuffer(0),buf_szie*sizeof(wchar_t));
source.ReleaseBuffer();
GlobalUnlock(clipbuffer);
SetClipboardData(CF_UNICODETEXT,clipbuffer);
CloseClipboard();
}
两者对比发现,其实相似的地方还是很多的,不同的地方就是:
//ASCII
char* buffer;
//Unicode
wchar_t* buffer;
//ASCII
GlobalAlloc(GMEM_DDESHARE,source.GetLength()+1);
//Unicode
GlobalAlloc(GMEM_DDESHARE,(source.GetLength()+1)*sizeof(wchar_t));
//ASCII
SetClipboardData(CF_TEXT,clipbuffer);
//Unicode
SetClipboardData(CF_UNICODETEXT,clipbuffer);
//在Unicode下我们还定义了int buf_szie = source.GetLength(); 是为了让代码看起来简短
//很关键的复制方法是不同的,具体需要哪个来实现那就是能实现就行
//ASCII
strcpy(buffer,(LPSTR)(LPCTSTR)source);
//Unicode
memset(buffer,0,(buf_szie+1)*sizeof(wchar_t));
memcpy_s(buffer,buf_szie*sizeof(wchar_t),source.GetBuffer(0),buf_szie*sizeof(wchar_t));
source.ReleaseBuffer();
//关于char 和wchar_t ,网上看到说关于Length的计算方法要调用不同函数
//ASCII
CString source;
source.GetLength();
//Unicode
Function(const wchar_t* data_str)
{
int buf_szie = wcslen(data_str);
}
//实际测试,source.GetLength()不论是在ASCII和Unicode都可以使用,具体什么情况可能目前阶段我还不是太清楚,需要后期学习。
关于内存操作的链接:http://www.cplusplus.com/reference/cstring/memcpy/