剪贴板通信实例

来源:互联网 发布:牛牛辅助软件 编辑:程序博客网 时间:2024/05/16 17:08

剪贴板通信实例

本人节选自《21天学通VC++》一书

    为了更好地理解以上讲述的函数,下面给出一个实例来详细地介绍如何使用剪贴板来实现进程间的通信。
【范例17-3】剪贴板实现进程通信。
  新建一个MFC的基于对话框的应用程序。单击【File】|【New】菜单项,打开新建对话框。选择建立【MFC AppWizard[exe]】工程,为工程命名为“进程通信”。在AppWizard的第一步中选择【Dialog based】。其他步骤按照默认设置,单击【Finish】按钮完成创建。
  设计对话框。将对话框上的原有控件全部删除。添加两个文本框,一个让用户输入数据,ID号为IDC_EDIT_SEND;另一个是复制数据后用来显示数据的,ID号为IDC_EDIT_RECV。再添加两个按钮控件,一个名为“复制”,ID号为IDC_BTN_COPY;另一个名为“粘贴”,ID号设为IDC_BTN_PASTE。对话框设计结果。
  添加消息响应函数。双击对话框上的两个按钮,分别将两个按钮的OnBtnCopy和OnBtnPaste函数添加到类CMyDlg中。
提示:添加消息响应函数在MFC ClassWizard工具中,选中对应的按钮控件后,添加其COMMAND消息函数即可。
示例代码17-3
01    void CMyDlg::OnBtnCopy()                            //复制按钮
02    {
03        // TODO: Add your control notification handler code here
04        CString str;
05        //定义字符型变量用来保存用户输入的数据
06        GetDlgItemText(IDC_EDIT_SEND,str);
07        HGLOBAL hClip;
08        //定义一个HGLOBAL句柄变量用来指向分配的内存块
09        if (OpenClipboard())
10        {
11            EmptyClipboard();                            //将剪贴板内容清空
12            hClip=GlobalAlloc(GMEM_MOVEABLE,str.GetLength()+1);
13            //在堆上分配可移动的内存块,程序返回一个内存句柄
14            char * buff;                                 //定义指向字符型的指针变量
15            buff=(char*)GlobalLock(hClip);
16            //对分配的内存块进行加锁,将内存块句柄转化成一个指针,并将相应的引用计数器加1
17            strcpy(buff,str);
18            //将用户输入的数据复制到指针变量中,实际上就是复制到分配的内存块中
19            GlobalUnlock(hClip);
20            //数据写入完毕,进行解锁操作,并将引用计数器数字减1
21            SetClipboardData(CF_TEXT,hClip);
22            //将存放有数据的内存块放入剪贴板的资源管理中
23            CloseClipboard();
24            //关闭剪贴板,释放剪贴板资源的占用权
25            MessageBox("已将数据存入剪贴板");
26        }
27    }
28    void CMyDlg::OnBtnPaste()                            //粘贴按钮
29    {
30        // TODO: Add your control notification handler code here
31        CString str;
32        //字符型变量保存由剪贴板复制下来的数据
33        HANDLE hClip;
34        //定义HANDLE句柄型变量用来指向GetClipboardData函数返回的句柄
35        if (OpenClipboard())
36        {
37            hClip=GetClipboardData(CF_TEXT);
38            //从剪贴板中取出一个内存的句柄
39            char* buff;
40            //定义字符型指针变量用来保存内存块中的数据
41            buff=(char*)GlobalLock(hClip);
42            //对内存块进行加锁,将内存句柄值转化为一个指针,并将内存块的引用计数器加一,内存                //中的数据也返回到指针型变量中
43            str=buff;
44            //将数据保存到字符型变量中
45            GlobalUnlock(hClip);
46            //将内存块的引用计数器减一
47            CloseClipboard();
48            //关闭剪贴板,释放剪贴板资源的占用权
49            SetDlgItemText(IDC_EDIT_RECV,str);
50        }
51    }
【运行结果】在Visual C++ 6.0中编译后无错误,使用快捷键【Ctrl+F5】运行该工程。在左边的编辑框中输入字符串“21天学会Visual C++”。单击【复制】按钮,该字符串就存放到剪贴板中了。
说明:上述代码中用到了剪贴板的操作函数,此外,还应用到了字符串赋值函数strcpy(),用于将输入字符串复制到内存中。
在上图中单击【复制】按钮后,单击【粘贴】按钮。将存储在剪贴板中的字符串取出并显示在右边的编辑框中,如图17-18所示。
 
图17-18  【粘贴】按钮运行结果
【代码解析】从以上代码中可以看出,不管是把内存块放到剪贴板资源管理中,还是从剪贴板中取出内存块,都要经过加锁和解锁的过程。这是为了方便句柄型变量和字符型指针变量的转换,实现数据的写入和读取。上述代码中,【复制】按钮和【粘贴】按钮的执行流程如图17-19和图17-20所示。
至此,一个通过剪贴板实现进程通信的实例就完成了。事实上,本例中实现的功能不用剪贴板也一样能够很简单的完成。此处只是为了演示剪贴板的用法。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/broadview2006/archive/2009/01/16/3795912.aspx