首页 > 代码库 > 剪贴板
剪贴板
剪贴板实际上是系统维护管理的一块内存区域,当在一个进程中复制数据时,是将这个数据放到该块内存区域中,当在另一个进程中粘贴数据时,是从该块内存区域中取出数据,然后显示在窗口上;因为剪贴板是所有进程都可以访问的,如果某程序已经打开了剪贴板,则其他程序将不能修改剪贴板,直到前者调用了CloseClipboard函数,并且只有调用了EmptyClipboard函数清空剪贴板释放剪贴板上数据的句柄,打开剪贴板的当前窗口才拥有剪贴板;
1、打开剪贴板
BOOL OpenClipboard();
返回值:打开剪贴板成功返回非0值,如果其他程序或当前窗口已打开了剪贴板则返回0;
2、关闭剪贴板
BOOL CloseClipboard();
返回值:关闭成功返回非0值,关闭失败返回0;
3、清空剪贴板,释放剪贴板中数据的句柄
BOOL EmptyClipboard();
返回值:函数操作成功返回非0值,失败返回0;
4、以指定的剪贴板格式向剪贴板上放置数据
调用SetClipboardData函数的窗口必须是剪贴板的拥有者,在这之前,该程序必须已经调用了OpenClipboard函数打开了剪贴板;
HANDLE SetClipboardData(
UINT uFormat,
HANDLE hMem
);
uFormat:指定剪贴板格式,格式可以是已注册的格式或任一种标准的剪贴板格式;CF_TEXT为标准的剪贴板文本格式,该格式下每行数据以回车换行符终止,并以空字符作为数据的结尾;
hMem:具有指定格式的数据的句柄;可以设为NULL采用延迟提交技术,在剪贴板上以指定的格式放置一个空剪贴板数据块,直到有其他进程需要数据或者自身进程需要终止运行时,操作系统会向数据提供进程发送WM_RENDERFORMAT和WM_RENDERALLFORMAT消息,而数据提供进程在响应消息的函数中再次调用SetClipboardData函数,这时才真正提交数据到剪贴板上;再次调用SetClipboardData函数时,就不需要调用OpenClipboard函数和EmptyClipboard函数了;
5、调用GlobalAlloc函数从堆上分配指定数目的字节作为剪贴板数据的内存对象
HGLOBAL GlobalAlloc(
UINT uFlags,
DWORD dwBytes
);
uFlags:用来指定分配内存的方式,可取值如下;如果为0,对应为默认的GMEM_FIXED;
GHND --GMEM_MOVEABLE和GMEM_ZEROINIT的组合
GMEM_FIXED --分配一块固定内存,返回值是一个指针,该内存对象其锁计数总是0
GMEM_MOVEABLE --分配一块可移动的内存,返回值是一块内存对象句柄,可以用GlobalLock函数将这个句柄转换为一个指针;创建一个进程时,系统为程序分配一块默认堆,内存块在物理内存中不能被移动,但可以在一个默认堆中被移动
GMEM_ZEROINIT --初始化内存的内容为0
GPTR --GMEM_FIXED和GMEM_ZEROINIT的组合
dwBytes:指定分配的字节数;
LPVOID GlobalLock( HGLOBAL hMem );
该函数将一个全局内存对象句柄转换为一个指针;每个内存对象的内部数据结构中都包含了一个初始值为0的锁计数,对于可移动的内存对象来说,GlobalLock函数将其锁计数加1,而GlobalUnlock函数将该锁计数减1;被锁定的内存对象的内存块将保持锁定,不能被移动或被废弃,直到它的锁计数为0或调用GlobalRealloc函数重新分配该内存对象,该内存块才能被移动或被废弃;
BOOL GlobalUnlock( HGLOBAL hMem );
对于一个进程来说,每调用一次GlobalLock函数后,一定要调用对应次数的GlobalUnlock函数;
6、从剪贴板中获得指定格式的数据
HANDLE GetClipboardData( UINT uFormat );
返回值:返回一个指定格式存在的剪贴板对象的句柄;
7、查看剪贴板中是否有所需的特定格式的数据
BOOL IsClipboardFormatAvailable( UINT format );
返回值:如果剪贴板上有所需的数据格式可用,则返回非0值,否则返回0;
剪贴板