windows下的剪切板编程详解

说道剪切板大家都不陌生吧 ,右键粘贴 都用过。其实编程也很简单,但是在进程之间的通信 却有着不可替代的作用 ,剪切板说白了就是一个缓冲区 ,但是这个缓冲区不是某个进程的私有空间,而被全部进程所共享。windows下的每个进程都可以共享剪切板中的数据 。其实我以前也学过剪切板编程但是一直没有真正理解,于是又学习了一遍。终于明白了。。。写下来分享下。。。。

要使用剪切板就要了解剪切板的几个函数 ?

<strong>BOOL EmptyClipboard(VOID); //清空剪切板并且释放与剪切板相关的数据的句柄 </strong> 
 
<strong>BOOL OpenClipboard( HWND</strong><em> <a target=_blank href="">hWndNewOwner</a></em> <strong>); //打开剪切板并且阻止其他应用程序 修改剪切板的内容 hwnd为当前打开窗体的句柄</strong> 
 
<strong>HGLOBAL GlobalAlloc( UINT</strong><em> <a target=_blank href="">uFlags</a></em><strong>, SIZE_T</strong><em> <a target=_blank href="">dwBytes</a></em> <strong>); //在全局堆分配一块内存,windows内存管理器不提供单独的全局对和本地堆 ,这个函数比起他内存 函数慢,但是这个函数仍然在剪切板等应用中使用。 有人可能会问了,为什么不用new或者 malloc呢? 那是因为你的new和malloc所分配的空间只是在一个进程中分配的,它并不能被windows下所有进程所共享 。 </strong> 
<strong>(*)他返回的不是一个内存块的指针,而是一个内存对象的句柄 。 我们可以通过GloabalLock()获得内存指针,。。。</strong> 
 
<strong>LPVOID GlobalLock( HGLOBAL</strong><em> <a target=_blank href="">hMem</a></em><strong>); //锁定一个内存对象,并且返回指向这个内存对象的第一个字节的指针 。 对于可移动的内存对象来说,其内部的数据结构包含一个计数器,GlobalLock会是这个计数器+1 ,GlobalUnLock使这个计数器-1 。 锁定的内存块将不会被 移动或者丢弃 除非调用了GlobalReAlloc函数 .每次调用完一个GlobalLock函数 对应调用GlobalUnLock函数 。</strong> 
 
<strong>BOOL GlobalUnlock( HGLOBAL</strong><em> <a target=_blank href="">hMem</a></em> <strong>); 减少GMEM_MOVEABLE类型内存对象的锁定计数,对于GMEM_FIXED类型的内存对象没有影响 </strong> 
 
</pre><pre name="code"><strong>BOOL CloseClipboard(VOID); //当一个应用程序使用完剪切板应该调用这个函数 关闭剪切板,允许其他程序访问 剪切板 。</strong> 
 
<strong>HANDLE SetClipboardData( UINT</strong><em> <a target=_blank href="">uFormat</a></em><strong>, HANDLE</strong><em> <a target=_blank href="">hMem</a></em> <strong>); //将指定的内存对象的数据 设置到剪切板 。</strong> 
 
<strong>HANDLE GetClipboardData( UINT</strong><em> <a target=_blank href="">uFormat</a></em> <strong>); //从剪切板获得指定的数据,这个函数调用前 剪切板必须被打开 。</strong> 
 
</pre><pre name="code"><strong>BOOL IsClipboardFormatAvailab<wbr>le(UINT</wbr></strong><em> <a target=_blank href="">format</a></em><strong>); //检测剪切板中是否有指定格式的数据</strong> 
 
 
<strong>函数介绍完了下面就是应用 : </strong> 
<strong>1、向剪切板中增加数据 ,这里我用文本做示范 、</strong> 
 ::OpenClipboard(m_hWnd) ;// 打开剪切板 防止其他 进程第剪切板操作 EmptyClipboard() ;//清空剪切板 并且将权限附加到 打开剪切板的窗体 HANDLE h=GlobalAlloc(GMEM_FIXED,100) ; //在全局堆分配内存并且返回句柄 char *p=(char*) GlobalLock(h) ; //锁定指定内存对象,返回内存指向对象第一个字节的指针,增加内存对象的锁定计数 strcpy(p,"this is a ClipBoard test") ; //将字符串拷贝到全局堆 SetClipboardData(CF_TEXT,h) ; //将指定内存对象的数据设置到剪切板 GlobalUnlock(h) ;//解锁内存对象 并且减少锁定计数 CloseClipboard() ; //关闭剪切板 在调用Open之后 必须有
<strong>2、清空剪切板</strong> 
 ::EmptyClipboard() ; //清空剪切板
3、获得剪切板的数据
 ::OpenClipboard(m_hWnd) ; //打开剪切板 if (IsClipboardFormatAvailab<wbr>le(CF_TEXT)) //如果剪切板中有文本类型的数据 { HANDLE h=GetClipboardData(CF_TEXT); // 获得剪切板数据 所在的内存对象 char * p=(char*)GlobalLock(h) ; //通过锁定内存对象 获得剪切板缓冲区的指针 GlobalUnlock(h) ; //解锁内存对象 减少 内存对象的锁定技术 MessageBox(p) ; }</wbr>
  • 0
    点赞
  • 0
    收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:酷酷鲨 设计师:CSDN官方博客 返回首页
评论
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值