进程间通信之(一)剪贴板

来源:互联网 发布:华为大数据在贵州 编辑:程序博客网 时间:2024/06/05 16:43

剪贴板实际上是系统维护管理的一块内存区域,当在一个进程中复制数据时,是将这个数据放到该块内存区域中,当在另一个进程中粘贴数据时,是从该块内存区域中取出数据。

剪贴板的VC实现很简单,下面是剪贴板实现过程以及我学习过程中的一些理解:

1.首先建立一个基于对话框的应用程序,并添加2个edit box和2个button,在这里,ID号分别为:IDC_EDIT_SEND,IDC_EDIT_RECV,IDC_BTN_SEND,IDC_BTN_RECV。并为button控件添加2个消息相应函数,分别为:OnBtnSend(),OnBtnRecv()。

2.OnBtnSend()函数下面添加相应代码,在这里实现文本通信:

(1)打开剪贴板,函数为OpenClipboard() 如果成功,返回非零值,否则,零值;

(2)如果打开成功,则获取剪贴板的使用权。调用函数EmptyClipboard();

(3)获取要传输的文本信息,GetDlgItemText(IDC_EDIT_SEND,CString);

(4)在前面第一句话就介绍了,剪贴板实际上是一块内存区域,所以接下来,我们要申请一块内存,调用GlobalAlloc(UINT,SIZE_T)分配内存。其中有2个参数,前面一个是标记,后面一个是分配字节数。这个函数如果成功则返回一个句柄。

(5)申请好了内存区域,我们要将文本字符串放入内存中。而前面申请内存时,返回的是一个句柄,所以要将句柄转为指针,在这里用GlobalLock(hMem);这个函数的参数是一个全局内存对象,返回该对象内存块第一个字节的指针。获得内存指针后,调用strcpy(char*,const char*)将文本字符串复制到内存中。最后不要忘记调用解锁函数GlobalUnLock(hMem);

(6)将文本信息放置到剪贴板上SetClipboardData(CF_TEXT,hMem);

(7)关闭剪贴板CloseClipboard(hMem);

具体代码如下:

//////////////////////////

 if (OpenClipboard())
 {
  EmptyClipboard();
  
  CString str;
  HANDLE hClip;
  char* pBuf;
  
  GetDlgItemText(IDC_EDIT_SEND,str);
  hClip = (char*)GlobalAlloc(GMEM_MOVEABLE,str.GetLength()+1);
  pBuf = (char*)GlobalLock(hClip);
  strcpy(pBuf,str);
  GlobalUnlock(hClip);
  
  SetClipboardData(CF_TEXT,hClip);
  CloseClipboard();
 }

//////////////////////////////

3.OnBtnRecv()函数接收剪贴板中信息:

(1)打开剪贴板OpenClipboard()

(2)在这里进行一个判断,看剪贴板上是否有我们要的信息。函数IsClipboardFormatAvailable(CF_TEXT)

(3)读取剪贴板上,我们需要的信息。函数GetClipboardData(CF_TEXT);返回值是一个以指定格式存在的剪贴板对象的句柄;

(4)然后将句柄转为地址,调用GlobalLock()和GlobalUnLock(),获取内存地址;

(5)将数据放到IDC_EDIT_RECV中,SetDlgItemText();

(6)不要忘记关闭剪贴板。

具体代码如下:

///////////////////////////
 if (OpenClipboard())
 {
  if(IsClipboardFormatAvailable(CF_TEXT))
  {
   
   char* pBuf;
   HANDLE hClip;
   hClip = GetClipboardData(CF_TEXT);
   pBuf = (char*)GlobalLock(hClip);
   GlobalUnlock(hClip);
   SetDlgItemText(IDC_EDIT_RECV,pBuf);
  }
  CloseClipboard();
 }

///////////////////////////

 

原创粉丝点击