全局内存块:
剪贴板可以用于不同进程之间进行数据交换的一片内存空间(malloc 所分配的内存只适用当前进程),所以需要全局内存块(GlobalAlloc分配):
HGLOBAL GlobalAlloc( UINT, SIZE_T);
第一个参数:指定内存块的类型
第二个参数:分配内存块的空间大小
函数的返回值有两种,一种是 返回句柄(GMEM_MOVEABLE 指内存块可移动,内存地址不确定,所以以句柄形式记录)或 返回内存块地址(GMEM_FIXED 指内存块不可移
动,为确定的内存地址)
为防止内存过于零碎,第一个参数一般设置为 GMEM_MOVEABLE(可以把多块零碎的内存块合并为一块大的内存块) | GMEM_ZEROINIT(初始化内存块为 0)
HGLOBAL hGlobal;
hGlobal = GlobalAlloc( GMEM_MOVEABLE | GMEM_ZEROINIT, SIZE_T);
全局内存块的使用:
如果全局内存块的类型是移动的(GMEM_MOVEABLE),调用 GlobalLock( HGLOBAL) 锁定内存块(句柄中储存内存块的地址,内存块锁定计算器 +1 ,内存块不可移动)
在使用完全局内存块后,调用 GlobalUnlock( HGLOBAL) 解锁内存块(内存块锁定计算器 -1,只有当锁定为 0 时,内存块才能移动)
int *p;
HGLOBAL hGlobal
hGlobal = GlobalAlloc( GMEM_MOVEABLE | GMEM_ZEROINIT, SIZE_T);
p = (int *)GlobalLock( hGlobal); // 锁定内存块,p 指向 全局内存块的地址
【
剪贴板的调用
】
GlobalUnlock( hGlobal); //解锁内存块
Globalfree( HGLOBAL);
剪贴板的使用:
往剪贴板输入数据
OpenClipboard( HWND); // 打开剪贴板
EmptyClipboard(); //清空剪贴板
SetClipboardData( UINT, HGLOBAL); //指定剪贴板的类型,把全局内存块地址绑定到剪贴板上(应该类似于把剪贴板指针指向内存块地址)
CloseClipboard(); //关闭剪贴板
SetClipboard 第一个参数指定剪贴板的数据类型:
CF_TEXT:以 NULL 结尾的 ANSIC 字符集的字符串
CF_UNICODETEXT:Unicode 字符集的字符串,双字节 NULL 结尾
CF_DIB:设备无关位图
CF_WAVE:波形声像文件
............
提取剪贴板数据
OpenClipboard( HWND);
hGlobal = GetClipboardData( UINT); //类似于把 hGlobal 指向剪贴板指针所指的内存地址
CloseClipboard();
剪贴板的使用规则:
1、数据提取或输入必须在 OpenClipboard 和 CloseClipboard 之间进行
2、内存块一旦被绑定到剪贴板时,不可再更该内存块的数据