//**********复制文本到剪贴板**********
CString text = _T("我是中国人");
BOOL b = OpenClipboard(); //打开剪贴板
/*
返回值:
如果通过CWnd打开了剪贴板,则返回非零值
如果其他应用程序或窗口已经打开了剪贴板,则返回零
说明:
在调用Windows的CloseClipboard函数之前,其他应用程序将不能修改剪贴板的内容
在调用Windows的EmptyClipboard函数之前,当前的CWnd对象将不会成为剪贴板的拥有者。
*/
if (b) {
EmptyClipboard(); // 清空剪贴板内容
HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, (text.GetLength() + 1) * sizeof(TCHAR)); // 分配内存
/*
参数1 类型及说明
uFlags Long,对分配的内存类型进行定义的常数标志,如下所示:
GMEM_FIXED 分配一个固定内存块,返回值是一个指针
GMEM_MOVEABLE 分配一个可移动内存块
分配可移动的内存,在Win32中内存块在物理内存中是不可移动的,但在缺省堆中可以.
返回值是该内存对象的句柄,可使用函数 GlobalLock 将该句柄转换为一个指针.
这个标识不能与 GMEM_FIXED 组合使用.
GMEM_ZEROINIT 新分配的内存块全部初始化成零
GHND 为GMEM_MOVEABLE 和 GMEM_ZEROINIT的组合
GPTR 为GMEM_FIXED和GMEM_ZEROINIT组合
参数2:dwBytes Long,指定要申请的字节数.
若该参数为 0 且参数 uFlags 指定为 GMEM_MOVEABLE 则该函数返回一个内存对象的句柄,该内存对象被标识为discarded(可抛弃的)
返回值:若函数调用成功,则返回一个新分配的内存对象的句柄
若函数调用失败,则返回NULL。可调用GetLastError以获得更多错误信息
注解:
如果堆内没有足够的空间满足请求,函数将返回 NULL
若函数调用成功,将至少分配所需内存.若实际分配量超过所需,则内存仍然能够充分利用之.可用函数 GlobalSize 来确定实际所分配的字节数
可使用 GlobalFree 来释放内存。
*/
if (hMem != NULL) {
LPTSTR lptstrCopy = (LPTSTR)GlobalLock(hMem); // 锁定内存并绑定指定指针
/*
锁定内存中指定的内存块,除非用 GlobalUnlock 函数将内存块解锁,否则地址会一直保持有效
参数:HGLOBAL hMem 指定一个全局内存块的句柄,这个句柄是通过GlobalAlloc或GlobalReAlloc来得到的
返回值:Long,如成功,返回内存块的地址
如出错,或者这是一个已被丢弃的“可丢弃”内存块,则返回零。会设置GetLastError参数表
注意:调用过GlobalLock锁定一块内存区后,一定要调用GlobalUnlock来解锁
*/
_tcscpy_s(lptstrCopy, text.GetLength() + 1, text); // 复制文本到内存
/*
说明:参数1是指向内存hMem,其实就是把数据复制到内存hMem
*/
GlobalUnlock(hMem); // 解锁内存
HANDLE hand=SetClipboardData(CF_UNICODETEXT, hMem); // 设置剪切板
/*
参数1:UINT uFormat
CF_DIB——DIB图片,它包含一个BITMAPINFO结构,然后是位图位
CF_DIF——软件领域的数据交换格式
CF_PALETTE——调色板
CF_PENDATA——笔扩展的Microsoft笔计算的数据
CF_RIFF——表示更复杂的音频数据可以被表示为一个CF_WAVE的标准波形格式
CF_SYLK——微软符号链接(SYLK)格式
CF_TEXT——ANSI文本格式。回车/换行(CR-LF)组合表示换行。必须用NULL结束字符串。使用此格式为ANSI文本
CF_WAVE——表示在的标准电波格式之一,例如11kHz或22kHz的脉冲编码调制(PCM)的音频数据
CF_TIFF——TIFF标记图像文件格式
CF_UNICODETEXT——Unicode文本格式
CF_BITMAP 位图
参数2:HANDLE hMem 具有指定格式的数据的句柄,该参数可以是空
返回值:类型: HANDLE
如果函数成功,则返回值是数据的句柄
如果函数失败,则返回值为 NULL。 要获得更多的错误信息,请调用 GetLastError
*/
}
CloseClipboard(); // 关闭剪贴板
}
//**********从剪贴板中获取文本**********
if (IsClipboardFormatAvailable(CF_UNICODETEXT) && OpenClipboard()) {
/*
IsClipboardFormatAvailable 确定剪贴板是否包含指定格式的数据
返回值:类型: BOOL
如果剪贴板格式可用,则返回值为非零。
如果剪贴板格式不可用,则返回值为零。 要获得更多的错误信息,请调用 GetLastError
*/
HGLOBAL hMem = GetClipboardData(CF_UNICODETEXT); //获取剪贴板内容
/*
参数:UINT 指定要获取的数据的格式
常见的数据格式包括CF_TEXT(ANSI文本) 、CF_BITMAP(位图) 、CF_DIB(设备无关位图)等
傳回值:類型: HANDLE
如果函式成功,則傳回值是指定格式之剪貼簿物件的控制碼。
如果函式失敗,則傳回值為 Null。 若要取得擴充的錯誤資訊,請呼叫 GetLastError
*/
if (hMem != NULL) {
LPCTSTR lptstr = (LPCTSTR)GlobalLock(hMem);
CString text(lptstr);
GlobalUnlock(hMem);
// 对获取到的文本进行处理
::OutputDebugString(text);
}
CloseClipboard();
}