剪贴板和全局内存块

来源:互联网 发布:家具衣柜下料尺寸算法 编辑:程序博客网 时间:2024/06/07 19:05

全局内存块:

剪贴板可以用于不同进程之间进行数据交换的一片内存空间(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、内存块一旦被绑定到剪贴板时,不可再更该内存块的数据

0 0
原创粉丝点击