暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

剪贴板Clipboard的定义及VBA的引用

VBA语言専攻 2022-09-18
274
【分享成果,随喜正能量】和无关紧要的事情过不去,便是把自己推入麻烦中,很多时候,烦琐并不来自外界,而是关乎内心的,定力。。
《VBA信息获取与处理》教程(10178984)是我推出第六套教程,目前已经是第一版修订了。这套教程定位于最高级,是学完初级,中级后的教程。这部教程给大家讲解的内容有:跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互联网数据抓取、VBA延时操作,剪贴板应用、Split函数扩展、工作表信息与其他应用交互,FSO对象的利用、工作表及文件夹信息的获取、图形信息的获取以及定制工作表信息函数等等内容。程序文件通过32位和64位两种OFFICE系统测试。是非常抽象的,更具研究的价值。
教程共两册,八十四讲。今日的内容是”专题十二  VBA中剪贴板(Clipboard)的应用”:剪贴板Clipboard的定义及VBA的引用

第一节  剪贴板Clipboard是什么

我们在平时操作文件的时候经常会用到Ctrl+C/X、Ctrl+V的操作,就是把我们需要的内容复制,然后粘贴到我们需要的地方,这种操作非常符合人们感观上的认识,其实这种动作就是把内容首先放到了剪贴板即专用的内存中,只不过这种操作是在后台进行,我们没有看到罢了。

1  剪贴板Clipboard的定义及VBA的引用

Windows的帮助文件中有这样的叙述:剪贴板是从一个地方复制或移动并打算在其他地方使用的信息的临时存储区域。可以选择文本或图形,然后使用“剪切”或“复制”命令将所选内容移动到剪贴板,在使用“粘贴”命令将该内容插入到其他地方之前,它会一直存储在剪贴板中。例如,您可能要复制网站上的一部分文本,然后将其粘贴到电子邮件中。
对于VBA而言,MSForms库包含一个名为DataObject的对象,该对象支持在Windows剪贴板上使用文本字符串。VBA不支持剪贴板上其他非文本值所需的数据类型。若要在代码中使用数据对象,必须设置对Forms 2.0 Object Library的引用。在VBA中添加引用如下:
转到VBA编辑器中的“工具”菜单,然后选择“引用”项。在出现的对话框中,向下滚动列表,直到找到适当的库(常用的引用列在列表的顶部,之后,引用按字母顺序列出)。找到代码所需的引用时,选中引用标题旁边的复选框,然后单击“确定”

2  剪贴板Clipboard对象的特点

这个对象有什么特点,又是如何工作的呢?
1)公开性剪贴板中的数据存放在全局内存中,因此大部分的windows应用程序都可以访问其中的数据,在遵守相关API函数约定的前提下,应用程序可以自由地打开剪贴板(OpenClipboard),读取剪贴板内的数据(GetClipboardData),或者清空剪贴板(EmptyClipboard),然后设置剪贴板内的数据(SetClipboardData),最后关闭剪贴板(CloseClipboard);
2)独占性  Windows规定应用程序对剪贴板的访问是独占性的,当一个应用程序使用OpenClipboard打开剪贴板之后,其他程序就不可以再访问剪贴板,直至前一程序使用CloseClipboard关闭剪贴板。通常我们使用剪贴板的时候不会感觉受其他程序的影响,这是因为剪贴板内的数据操作都是在内存中进行的,速度非常快,对于特大块的数据,应用程序还可以选择延时处理(Delayed Rendering)机制以保证速度。但是,我们在对剪贴板编程的时候要注意:每次使用完剪贴板之后一定要记得使用CloseClipBoard关闭它;在OpenClipboard和CloseClipboard之间不要放置耗时很长的代码,以免影响其他程序正常工作。
3)规范性设置剪贴板内数据的应用程序窗口被称为剪贴板数据拥有者(ClipboardOwner),可以通过GetClipboardOwner函数获得它的句柄。反过来说,如果一个应用程序想向剪贴板中放入数据,需要先成为ClipboardOwner。程序要成为ClipboardOwner需要先将自己的句柄传给OpenClipboard函数,如果剪贴板中已经有数据存在,还需要先调用EmptyClipboard;
4)多元性剪贴板中可以同时存放多种格式的数据,各自放在全局内存的不同位置;剪贴板中的数据有标准格式/预定义格式的,如文本、位图、Wav声音……,也有非标准格式/用户自定义格式,比如word中的域和公式、Excel中的图表。
5)可检索性对于每种在剪贴板中存放过的格式,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函数,如果此名称已经存在,函数将返回此名称对应的编号,如果此名称不存在,函数将返回一个之前未使用的编号,在系统关机重启之前,这个名称和编号可以一直使用下去。
6)可监视性有一组特别的窗口可以持续监视剪贴板内的数据变化,这组窗口被称作剪贴板观察程序(ClipboardViewer),由它们构成的这个小圈子叫作剪贴板观察程序链ClipBoardViewerChain,每当剪贴板内数据发生变化时,windows将向消息链中的第一个窗口发送一个WM_DRAWCLIPBOARD消息,再由它转发给第二个……直至消息到达消息链中的最后一个窗口。同样,当消息链中的成员发生变化时,每个窗口都会收到一个WM_CHANGECBCHAIN消息;通过SetClipboardViewer函数,应用程序可以将自己的窗口句柄告诉windows,从而注册成为剪贴板观察程序链中的一员;通过ChangeClipboardChain函数,应用程序可以退出剪贴板观察程序链,而不影响它后面的窗口继续接收相关消息。

这讲我简单地介绍了一些剪切板相关的知识,对于大家掌握和利用这个知识点是十分有益的。其实不仅是对于VBA的理解,对于其他的语言也都大体一致。因为我参考的都是权威的论述。

3  剪贴板Clipboard一般操作

从上面的分析我们可以得到下面的结论,剪贴板可用于存储文本和图像等数据。由于所有活动进程都共享剪贴板,因此它可用于在这些活动进程之间传输数据。使用 Clipboard 对象可轻松访问剪贴板并从中读取和向其写入数据。我们可以利用的操作有:从剪贴板读取数据;确定存储在剪贴板中的文件类型;清除剪贴板的数据;将数据写入剪贴板。

本节知识点回向:
①什么是剪贴板?
②  剪贴板的特点是什么?
③   剪贴板的操作有哪些?




我20多年的VBA实践经验,全部浓缩在下面的各个教程中,教程学习顺序
 

【分享成果,随喜正能量】世间万物,本不是你的求也求不来,原本属于你的躲也躲不掉,人生哪有多如意,万事只求半称心。越去争,心也累;越去怨,命越苦。人生,不争不怨,纷纭的世界,独守己心,淡定从容,就拥有一份宁静和美好。

文章转载自VBA语言専攻,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论