<小fisher首发office精英俱乐部-http://www.officefans.net/cdb/,转载请注明出处>
  首先,讨论一下剪贴板是什么
  Windows的帮助文件中对剪贴板的描述是这样的:剪贴板是从一个地方复制或移动并打算在其他地方使用的信息的临时存储区域。可以选择文本或图形,然后使用“剪切”或“复制”命令将所选内容移动到剪贴板,在使用“粘贴”命令将该内容插入到其他地方之前,它会一直存储在剪贴板中。例如,您可能要复制网站上的一部分文本,然后将其粘贴到电子邮件中。大多数 Windows 程序中都可以使用剪贴板。
  对于经常使用Ctrl+C/X、Ctrl+V的Windows用户来说,这个解释是非常易懂并且符合人们感观上的认识的。
  既然我们今天讨论的话题是如何在VBA程序中通过API调用剪贴板,那就先看看微软MSDN中对于剪贴板的定义吧:剪贴板是一组用于在多个应用程序之间交换数据的函数和消息(原文:The clipboard is a set of functions and messages that enable applications to transfer data)。
  呵呵,是不是有些晕?没关系,因为这句话是针对C/C++程序员给出的说明,我们仍然可以按习惯上的理解把它当做一个对象(使用过VB6的同志们可能更容易理解,因为VB6中确实有一个名字叫ClipBoard的对象,它其实是VB对windows的剪贴板API函数封装后产生的真正的对象)。
  然后,再来看看这个对象有什么特点,又是如何工作的呢?概括来说,剪贴板有以下的特性(这是我个人总结的,不一定正确或精确,也不一定全面):
公开性
剪贴板中的数据存放在全局内存中,因此大部分的windows应用程序都可以访问其中的数据,在遵守相关API函数约定的前提下,应用程序可以自由地打开剪贴板(OpenClipboard),读取剪贴板内的数据(GetClipboardData)、或者清空剪贴板(EmptyClipboard)、然后设置剪贴板内的数据(SetClipboardData),最后关闭剪贴板(CloseClipboard);
独占性
既然剪贴板是公开的,那么多个程序同时访问必然会导致冲突,比如数据互相覆盖。因此,Windows规定应用程序对剪贴板的访问是独占性的,当一个应用程序使用OpenClipboard打开剪贴板之后,其他程序 就不可以再访问剪贴板,直至前一程序使用CloseClipboard关闭剪贴板 。通常我们使用剪贴板的时候不会感觉受其他程序的影响,这是因为剪贴板内的数据操作都是在内存中进行的,速度非常快,对于特大块的数据,应用程序还可以选择延时处理(Delayed Rendering)机制以保证速度。但是,我们在对剪贴板编程的时候要注意以下两点:1)每次使用完剪贴板之后一定要记得使用CloseClipBoard关闭 它;2)在OpenClipboard和CloseClipboard之间不要放置耗时很长的代码,以免影响其他程序正常工作。
设置剪贴板内数据的应用程序窗口被称为剪贴板数据拥有者(ClipboardOwner),可以通过GetClipboardOwner函数获得它的句柄。反过来说,如果一个应用程序想向剪贴板中放入数据,需要先成为ClipboardOwner。程序要成为ClipboardOwner需要先将自己的句柄传给OpenClipboard函数,如果剪贴板中已经有数据存在,还需要先调用EmptyClipboard;
多元性
剪贴板中可以同时存放多种格式的数据,各自放在全局内存的不同位置 ;剪贴板中的数据有标准格式/预定义格式的,如文本、位图、Wav声音……;也有非标准格式/用户自定义格式,比如word中的域和公式、Excel中的图表
可检索性
对于每种在剪贴板中存放过的格式,Windows都会给它分配一个独特的长整型编号,通过这个编号可以知道对应的数据格式的名称(GetClipboardFormatName),或者 查询对应的数据在剪贴板中是否存在(IsClipBoardFormatAvailable),如果存在,还可以通过这个编号找到对应的数据在内存中存放的位置(GetClipboardData);
对于标准格式,这个编号是固定的,可以通过VB6自带的APIViewer查询以CF_开头的常量得到,比如:
Public Const CF_TEXT = 1
Public Const CF_BITMAP = 2
Public Const CF_METAFILEPICT = 3
Public Const CF_SYLK = 4
……
对于非标准格式,这个编号由提供此格式数据的应用程序给此格式定义一个名称,然后将此名称传递给RegisterClipboardFormat函数,如果此名称已经存在,函数将返回此名称对应的编号,如果此名称不存在,函数将返回一个之前未使用的编号,在系统关机重启之前,这个名称和编号可以一直使用下去。
可监视性
有一组特别的窗口可以持续监视剪贴板内的数据变化,这组窗口被称作剪贴板观察程序(ClipboardViewer),由它们构成的这个小圈子叫作剪贴板观察程序链ClipBoardViewerChain,每当剪贴板内数据发生变化时,windows将向消息链中的第一个窗口发送一个WM_DRAWCLIPBOARD消息,再由它转发给第二个……直至消息到达消息链中的最后一个窗口,同样,当消息链中的成员发生变化时,每个窗口都会收到一个WM_CHANGECBCHAIN消息;
通过SetClipboardViewer函数,应用程序可以将自己的窗口句柄告诉windows,从而注册成为剪贴板观察程序链中的一员;通过ChangeClipboardChain函数,应用程序可以退出剪贴板观察程序链而不影响它后面的窗口继续接收相关消息。
希望以上文字能对大家重新认识剪贴板能够有所帮助。休息一会儿,我们再讨论剪贴板在Office VBA中的用途。

闲来无事,说说Windows剪贴板 -- 剪贴板概述部分相关推荐

  1. php 剪贴板,windows中剪贴板是指

    windows中剪贴板(ClipBoard)是内存中的一块区域,是Windows内置的一个非常有用的工具. 通过小小的剪贴板,架起了一座彩桥,使得在各种应用程序之间,传递和共享信息成为可能. (推荐学 ...

  2. Windows性能分析器概述(三)

    四.系统需求 下面的表格列出了安装和运行Windows性能分析器所需要的系统配置: 操作系统 Windows Vista SP1或更高版本,以及Windows Server 2008或更高版本 对于W ...

  3. Windows Workflow Foundation(1)- Windows Workflow Foundation 概述

    Windows Workflow Foundation(第一章)- Windows Workflow Foundation 概述 工作流概述 活动(Activity)是工作流的基本单元,用于描述实际进 ...

  4. python获取剪切板内容_如何从python中读取(windows)剪贴板中的文本?

    如何从python中读取(windows)剪贴板中的文本? 如何从python中读取(windows)剪贴板中的文本? Foo42 asked 2019-06-22T21:38:33Z 10个解决方案 ...

  5. Windows程序设计-剪贴板

    数据格式 内存配置 将文字传送到剪贴簿 从剪贴簿上取得文字 剪贴板的简单使用 延迟提出 自定义数据格式 剪贴板浏览器 Windows剪贴板允许把数据从一个程序传送到另一个程序中.它的原理相对而言比较简 ...

  6. Windows 10剪贴板历史记录清理

    正如我们所知道那样,新版Windows10中支持剪贴板历史记录功能,可跨设备同步,这样我们可以随时调出我们前边刚复制或需要重新调用的剪贴内容,体验效果大大提升. 如截图,在体验之余安全风险也呼之欲出, ...

  7. win11剪贴板数据如何删除 Windows清空剪贴板数据的步骤方法

    现在已经有很多小伙伴都更新了windows11系统,不过由于Win11系统的很多界面位置发生了改变,导致一些小伙伴不清楚如何清空剪贴板数据,那么碰到这种问题应该怎么办呢?下面就和小编一起来看看有什么解 ...

  8. Windows 8 VHD 概述与使用

    [VHD 概述] VHD(Microsoft Virtual Hard Disk format). 目前可以使用Microsoft Virtual PC 2007 and Microsoft Virt ...

  9. Windows Azure安全概述

    公告 :本博客为微软云计算中文博客 的镜像博客. 部分文章因为博客兼容性问题 ,会影响阅读体验 .如遇此情况,请访问 原博客 . 摘要 Windows Azure ,作为一个应用程序宿主平台必须提供私 ...

最新文章

  1. 最近在做托盘时,发现 CnTrayIcon1的OnClick 事件,不能被其它按钮来执行,蛋疼。...
  2. 基于Hyper-V3.0搭建XenDesktop7之九 部署虚拟应用之模板准备
  3. Lodash 中文文档 (v3.10.1) - “Lang” 方法
  4. 实战SSM_O2O商铺_36【商品】商品列表之Dao+Service+Controller层的实现
  5. 运行catia_教程 | CATIA宏的录制及应用
  6. Python全栈开发之3、数据类型set补充、深浅拷贝与函数
  7. hid在linux上的轮训时间,linux 自定义hid速度优化
  8. Vray-3.0 开箱宝典
  9. go语言 同步-读写锁
  10. python批量打印机excel_python批量设置多个Excel文件页眉页脚的脚本
  11. Brute Force_medium
  12. talib python文档_talib 中文文档(一):快速开始
  13. UNITY3d在移动设备上的一些优化实战(一)-概述
  14. app账号退不出去_2021个人所得税退税时间是什么时候?还可以退吗?
  15. uni-app 开发微信小程序定位
  16. android台式电脑系统安装,怎么在台式机上安装安卓系统
  17. 玩寻仙一个月之我感受
  18. 洛谷 3373 线段树
  19. Python学习:python数组模块用法
  20. Set? set和Set set的区别?

热门文章

  1. 正青春,加油吧青年人!
  2. rhce考试试题以及答案_rhce 考试题目总结
  3. 北京系列5——颐和园
  4. 专访吕毅:链家网技术架构的演进之路
  5. 为win7系统增加按文件内容搜索的功能
  6. 常用的几种富文本编辑器
  7. Adobe Fireworks CS6 安装完提示无法访问Adobe服务器 请检查Internet链接或防火墙设置(错误代码:P206)
  8. 文件夹的遍历(递归)
  9. SQL函数和存储过程的区别
  10. 【C++多线程】银行多人转账模拟