首页 > 代码库 > 剪贴板

剪贴板

剪贴板实际上是系统维护管理的一块内存区域,当在一个进程中复制数据时,是将这个数据放到该块内存区域中,当在另一个进程中粘贴数据时,是从该块内存区域中取出数据,然后显示在窗口上;因为剪贴板是所有进程都可以访问的,如果某程序已经打开了剪贴板,则其他程序将不能修改剪贴板,直到前者调用了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;

 

剪贴板