22、Windows API 进程间通信,剪贴板(Clipboard)
剪贴板由系统定义,并不属于任何一个特定的进程。系统中所有进程都可以访问和设置剪贴板。很多具有“复制”、“粘贴”功能的文字编译程序都是通过剪贴板进行操作。
剪贴板最大的特点就是数据传输没有明确的目标,数据是被动访问的,设置剪贴板的程序并不知道所设置的数据什么时候被访问,也不知道被哪个进程访问,剪贴板中的内容也可以多次访问,直到新的数据写入。因此通过剪贴板也是一种可供选择的进程间通信方式。但是由于系统中任何一个进程都可以无限制地访问剪贴板,剪贴板也是一种不可靠的通信方式。
参考[1,2]中介绍了对剪贴板的基本操作,包括设置剪贴板中的数据、从剪贴板获取数据等;及如何对剪贴板的修改进行监视,这种机制可以使用程序及时发现剪贴板中的数据变化;使用通过剪贴板传输数据可以具有实时性;还有剪贴板中数据的格式及自定义数据格式的方法。
Clipboard[3]。
1、监视剪贴板
原理:
(1) WM_DRAWCLIPBOA
系统提供了WM_DRAWCLIPBOARD消息用于监视剪贴板的变。如果调用
SetClipboardViewer函数设置了窗口为剪贴板查看器,那么当剪贴板中的内容变化时,所注册的查看器窗口会收到WM_CHANGECBCHAIN消息和WM_DRAWCLIPBOARD消息。
当剪贴板中的内容变化时,窗口会收到WM DRAWCLIPBOARD消息。当查看器链新的节点加入或有节点退出窗口会收到WM_CHANGECBCHAIN消息。
(2) SetClipboardViewer函数
2、剪贴板数据格式
剪贴板中可能会存在各种各样的数据。因此剪贴板中在保存数据的同时还需要保存数据的格式信息。
系统使用一个UINT类型的数据来表示剪贴板中的数据格式。在这些格式信息中,有很多是各种应用程序之间通用的,比如文本、位图等。这些数据格式已经由系统预先定义,称为标准格式。
还有一些应用程序也希望自行定义剪贴板的数据格式,这样可以方便地在同一个应用程序的不同实例间进行数据传递而不需要对数据的格式进行过多的处理(典型的就包括Word)。
参考
[1] 精通Windows API 函数、接口、编程实例
[2] http://www.cnblogs.com/mydomain/archive/2010/09/04/1818257.html
[3] http://msdn.microsoft.com/en-us/library/ms649012%28VS.85%29.aspx