`
cloudtech
  • 浏览: 4605827 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

vc++之剪贴板通信实例

 
阅读更多

剪贴板通信实例

本人节选自《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所示。
至此,一个通过剪贴板实现进程通信的实例就完成了。事实上,本例中实现的功能不用剪贴板也一样能够很简单的完成。此处只是为了演示剪贴板的用法。

分享到:
评论

相关推荐

    进程通信 剪贴板 实例

    VC++6.0 进程之间通信 实例 实现剪贴板功能

    进程间通信的VC++源码实例集,邮槽、匿名管道等

    进程间通信的VC++源码实例集,进程之间的通信以及实现方法实例,通过一些小程序来实现,这些小程序有剪贴板实例、邮槽、匿名管道等,希望对VC++基础用户有帮助。

    剪贴板发送和接收数据的VC++实例

    摘要:VC/C++源码,系统相关,剪贴板 剪贴板发送和接收数据的VC++实例,主要是说明进程间通信的问题,例子源代码相对简单,高手可以跳过此源码,VC++新手们请下载源码参考。

    VC++ 四种进程间通信的完整实例

    VC++ 四种进程间通信的完整实例,一般来说,进程通信采取四种形式:剪贴板、匿名管道、命名管道、邮槽。孙鑫将带你用实例来验证这四种方式的优略性,进而帮助VC编程者熟悉掌握进程间通信的方方面面,并附有孙鑫老师...

    vc++ 开发实例源码包

    演示了OpenG的使用方法,内含几个实例,一个实例就3个文件。 p2p vb实例。 p2p+technology 文档。 P2P视频技术源码(含开发文档) 目前的协议有如下一些特点: 1) 客户向服务器发送请求, 每个请求的长度不定. 请求...

    vc++ 应用源码包_3

    vc++动态链接库编程之DLL典型实例源代码下载 VC++仿Dreamweaver取色器源代码 VC++挂机锁屏系统源程序 VC++建立桌面或开始菜单快捷方式 VC++界面库编程 SkinMagic 2.21 动态库版本的使用和 Skin++动态库及静态库版本...

    vc++ 应用源码包_1

    vc++动态链接库编程之DLL典型实例源代码下载 VC++仿Dreamweaver取色器源代码 VC++挂机锁屏系统源程序 VC++建立桌面或开始菜单快捷方式 VC++界面库编程 SkinMagic 2.21 动态库版本的使用和 Skin++动态库及静态库版本...

    vc++ 应用源码包_5

    vc++动态链接库编程之DLL典型实例源代码下载 VC++仿Dreamweaver取色器源代码 VC++挂机锁屏系统源程序 VC++建立桌面或开始菜单快捷方式 VC++界面库编程 SkinMagic 2.21 动态库版本的使用和 Skin++动态库及静态库版本...

    vc++ 应用源码包_2

    vc++动态链接库编程之DLL典型实例源代码下载 VC++仿Dreamweaver取色器源代码 VC++挂机锁屏系统源程序 VC++建立桌面或开始菜单快捷方式 VC++界面库编程 SkinMagic 2.21 动态库版本的使用和 Skin++动态库及静态库版本...

    vc++ 应用源码包_6

    vc++动态链接库编程之DLL典型实例源代码下载 VC++仿Dreamweaver取色器源代码 VC++挂机锁屏系统源程序 VC++建立桌面或开始菜单快捷方式 VC++界面库编程 SkinMagic 2.21 动态库版本的使用和 Skin++动态库及静态库版本...

    Windows编程循序渐进.part2

    14.4.1 剪贴板通信机制 267 14.4.2 实例:使用剪贴板实现进程间通信示例 269 第15章 线程同步 275 15.1 原子访问 275 15.1.1 多线程访问共享数据问题 275 15.1.2 互锁系列函数 276 15.2 关键代码段 277 ...

    Windows编程循序渐进.part3

    14.4.1 剪贴板通信机制 267 14.4.2 实例:使用剪贴板实现进程间通信示例 269 第15章 线程同步 275 15.1 原子访问 275 15.1.1 多线程访问共享数据问题 275 15.1.2 互锁系列函数 276 15.2 关键代码段 277 ...

    Visual_C++精彩实例详解

    第5章 剪贴板查看程序 第6章 进程查看程序 第7章 透明窗体实例 第8章 状态栏对话框 第9章 带微调和滑动条控件的工具栏 第10章 仿Winamp界面多媒体播放器 第11章 数据库操作--ODBC篇 第12章 数据库操作-DAO篇 第13章...

    Windows应用程序捆绑核心编程光盘代码

    3.7 使用Windows剪贴板通信 67 3.7.1 使用剪贴板实现进程间通信的方法 68 3.7.2 使用剪贴板实现进程间通信的实例 68 3.8 使用动态数据交换(DDE)通信 70 3.8.1 使用DDE技术通信原理 70 3.8.2 如何使用DDEML...

    Visual_C++精彩实例详解.part2.rar

    第5章 剪贴板查看程序 第6章 进程查看程序 第7章 透明窗体实例 第8章 状态栏对话框 第9章 带微调和滑动条控件的工具栏 第10章 仿Winamp界面多媒体播放器 第11章 数据库操作--ODBC篇 第12章 数据库操作-DAO篇 第13章...

    Visual_C++精彩实例详解.part4.rar

    第5章 剪贴板查看程序 第6章 进程查看程序 第7章 透明窗体实例 第8章 状态栏对话框 第9章 带微调和滑动条控件的工具栏 第10章 仿Winamp界面多媒体播放器 第11章 数据库操作--ODBC篇 第12章 数据库操作-DAO篇 第13章...

    Visual_C++精彩实例详解.part5.rar

    第5章 剪贴板查看程序 第6章 进程查看程序 第7章 透明窗体实例 第8章 状态栏对话框 第9章 带微调和滑动条控件的工具栏 第10章 仿Winamp界面多媒体播放器 第11章 数据库操作--ODBC篇 第12章 数据库操作-DAO篇 第13章...

    Visual_C++精彩实例详解.part3.rar

    第5章 剪贴板查看程序 第6章 进程查看程序 第7章 透明窗体实例 第8章 状态栏对话框 第9章 带微调和滑动条控件的工具栏 第10章 仿Winamp界面多媒体播放器 第11章 数据库操作--ODBC篇 第12章 数据库操作-DAO篇 第13章...

Global site tag (gtag.js) - Google Analytics