clipboard:利用API函数完成剪贴板Clipboard的操作

 2021-06-29 11:14    77  

大家好clipboard,我们今日讲解"VBA信息获取与处理"教程中第十二个专题"VBA中剪贴板(Clipboard)的应用"的第三节"利用API函数完成剪贴板Clipboard的操作",这个专题是非常有用的知识点,希望大家能掌握利用。

clipboard:利用API函数完成剪贴板Clipboard的操作

第三节 利用API函数完成剪贴板Clipboard的操作在上一讲中clipboard,我们对剪贴板中的文本简单操作进行了了解,是利用MSForms.DataObject对象来完成的,这种对象有前期绑定和后期绑定两种方式都可以实现目标。今天我们讲解利用API函数来完成对剪贴板的操作。这种方式的操作可以设计到各个方面。

clipboard:利用API函数完成剪贴板Clipboard的操作

1 必要的API函数了解为了利用API函数达到我们的目的,我们先来了解一下将利用到的API函数clipboard。

clipboard:利用API函数完成剪贴板Clipboard的操作

1)OpenClipboard函数:作用是打开剪贴板

clipboard:利用API函数完成剪贴板Clipboard的操作

声明及引用:Declare Function OpenClipboard Lib "user32" Alias "OpenClipboard" (ByValhwnd As Long) As Long

clipboard:利用API函数完成剪贴板Clipboard的操作

如果调用成功,它会返回一个非0值;如果失败,则返回0;如果有其他窗口已经打开剪贴板,这个函数会调用失败。如果函数调用成功,一定要记得使用CloseClipboard函数关闭它。

clipboard:利用API函数完成剪贴板Clipboard的操作

2)GetClipboardData函数:作用是读取剪贴板里面的数据

clipboard:利用API函数完成剪贴板Clipboard的操作

声明及引用:Declare Function GetClipboardData Lib "user32" (ByValwFormat As Long) As Long

如果调用成功,返回剪贴板中以指定格式存放的剪贴板对象的句柄;如果调用失败,返回Null;在使用GetClipboardData之前,必须先成功调用OpenClipboard

3)CopyMemory函数将一定字节长度的数据从内存中的一个位置(源)复制到另一个位置(目的地)

声明及引用:Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

这个函数需要三个参数:

Destination:目的地的第一个字节的内存地址(指针)

Source:   源的第一个字节的内存地址(指针)

Length:   要复制的数据的长度

4)GlobalLock函数锁定一个全局内存对象并返回它所占用内存块的第一个字节的内存地址(指针)

声明及引用:Declare Function GlobalLock Lib "kernel32" (ByValhMem As Long) As Long

5)GlobalSize函数返回给定内存对象的字节长度

声明及引用:Declare Function GlobalSize Lib "kernel32" (ByValhMem As Long) As Long

6)GlobalUnlock函数将可移动(GMEM_MOVEABLE)内存对象的锁计数器数值-1,对于固定位置(GMEM_FIXED)的内存对象,这个函数不起作用

声明及引用:Declare Function GlobalUnlock Lib "kernel32" (ByValhMem As Long) As Long

7)CloseClipboard函数关闭剪贴板

声明及引用:Declare Function CloseClipboard Lib "user32"() As Long

有了上面的7个API函数,我们就可以利用API函数来操控剪贴板了。

2 利用API函数实现剪贴板操作的代码实现我给出利用上述API函数实现剪贴板操作的代码:

Declare Function OpenClipboard Lib "user32" (ByValhwnd As Long) As Long

Declare Function GetClipboardData Lib "user32" (ByValwFormat As Long) As Long

Declare Function CloseClipboard Lib "user32" () As Long

Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Declare Function GlobalLock Lib "kernel32" (ByValhMem As Long) As Long

Declare Function GlobalUnlock Lib "kernel32" (ByValhMem As Long) As Long

Declare Function GlobalSize Lib "kernel32" (ByValhMem As Long) As Long

Private Const CF_TEXT = 1

Sub mynzB()

Dim hMem As Long

Dim lpData As Long

Dim nClipSize As Long

Dim bytClipData() As Byte

Dim sClipString As String

Sheets("sheet1").Select

Range("A1").Copy

If OpenClipboard(ByVal 0&) Then '如果OpenClipboard函数返回非0值,说明成功打开剪贴板

hMem = GetClipboardData(CF_TEXT) '获取剪贴板中以文本格式存在的内存对象的句柄

If CBool(hMem) Then '如果剪贴板中对应的格式不存在,此时的hMem会是0(Null),这里用CBool把它转换成Boolean类型加以判断

lpData = GlobalLock(hMem) '获取内存对象第一个字节的内存地址

nClipSize = GlobalSize(hMem) '获取内存对象的字节长度

ReDimbytClipData(1 To nClipSize) '修改缓冲字节数组的长度,确保能够容纳内存对象的全部数据

CopyMemorybytClipData(1), ByVallpData, nClipSize '复制内存对象的数据到字节数组中,注意Byval的用法

sClipString = StrConv(bytClipData, vbUnicode) '将字节转化成字符串

MsgBox "当前剪贴板内的文本是:" &vbCrLf&sClipString '将结果显示给用户

Else

MsgBox "当前剪贴板内没有文本"

End If

CloseClipboard

End If

End Sub

代码截图:

代码讲解:

1)If OpenClipboard(ByVal 0&) Then '打开剪贴板,如果OpenClipboard函数返回非0值,说明成功打开剪贴板。

2)hMem = GetClipboardData(CF_TEXT) '获取剪贴板中以文本格式存在的内存对象的句柄,各个值如下:

Public Const CF_TEXT = 1

Public Const CF_BITMAP = 2

Public Const CF_METAFILEPICT = 3

Public Const CF_SYLK = 4

3)If CBool(hMem) Then '当取得hMem的返回之后,如果剪贴板中对应的格式不存在,此时的hMem会是0(Null),这里用CBool把它转换成Boolean类型加以判断

4) lpData = GlobalLock(hMem) '获取内存对象第一个字节的内存地址

nClipSize = GlobalSize(hMem) '获取内存对象的字节长度

5)CopyMemorybytClipData(1), ByVallpData, nClipSize '复制内存对象的数据到字节数组中,注意Byval的用法

sClipString = StrConv(bytClipData, vbUnicode) '将字节转化成字符串,

6)StrConv函数返回按指定类型转换的 Variant (String)。

语法:StrConv(string, conversion, LCID)

string 必要参数。要转换的字符串表达式。

conversion 必要参数。Integer。其值的和决定转换的类型。

LCID 可选的。如果与系统LocaleID不同,则为LocaleID(系统LocaleID为缺省值。)

conversion 参数的设置值为:

vbUpperCase 1 将字符串文字转成大写。

vbLowerCase 2 将字符串文字转成小写。

vbProperCase 3 将字符串中每个字的开头字母转成大写。

vbWide* 4* 将字符串中单字节字符转成双字节字符。

vbNarrow* 8* 将字符串中双字节字符转成单字节字符。

vbKatakana** 16** 将字符串中平假名字符转成片假名字符。

vbHiragana** 32** 将字符串中片假名字符转成平假名字符。

vbUnicode 64 根据系统的缺省码页将字符串转成 Unicode。

vbFromUnicode128 将字符串由 Unicode 转成系统的缺省码页。

7)CloseClipboard关闭剪贴板,以便其他程序再次访问。

3 利用API函数实现剪贴板操作的实现效果下面是工作表的界面:

运行结果:

这讲给大家讲解了利用API函数实现剪贴板操作的方法,是非常重要的一讲内容。

本节知识点回向:

① 实现剪贴板操作的API函数会利用到哪些?

② 复制的API函数需要几个参数?

本讲代码参考文件:012工作表.xlsm

积木编程的思路内涵:在我的系列书籍中一直在强调"搭积木"的编程思路,这也是学习利用VBA的主要方法,特别是职场人员,更是要采用这种方案。其主要的内涵:

1 代码不要自己全部的录入。你要做的是把积木放在合适的位置然后去修正代码,一定要拷贝,从你的积木库中去拷贝,然后修正代码,把时间利用到高效的思考上。

2 建立自己的"积木库"。平时在学习过程中,把自己认为有用的代码放在一起,多积累,在用到的时候,可以随时拿来。你的积木库资料越多,你做程序的思路就会越广。

VBA的应用界定及学习教程:VBA是利用Office实现个人小型办公自动化的有效手段(工具)。这是我对VBA的应用界定。在取代OFFICE新的办公软件没有到来之前,谁能在数据处理方面做到极致,谁就是王者。其中登峰至极的技能非VBA莫属!

我记得20年前自己初学VBA时,那时的资料甚少,只能看源码自己琢磨,真的很难。20年过去了,为了不让学习VBA的朋友重复我之前的经历,我根据自己多年VBA实际利用经验,推出了六部VBA专门教程:

第一套:VBA代码解决方案 是VBA中各个知识点的讲解,教程共147讲,覆盖绝大多数的VBA知识点,提供的程序文件更是一座不可多得的代码宝库,是初学及中级人员必备教程;目前这套教程提供的版本是修订第二版,程序文件通过32位和64位两种OFFICE系统测试。

第二套:VBA数据库解决方案 数据库是数据处理的专业利器,教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法和实例操作,适合中级人员的学习。目前这套教程提供的是修订第一版教程,程序文件通过32位和64位两种OFFICE系统测试。

第三套:VBA数组与字典解决方案 数组和字典是VBA的精华,字典是VBA代码水平提高的有效手段,值得深入的学习,是初级及中级人员代码精进的手段。目前这套教程提供的版本是修订第一版,程序文件通过32位和64位两种OFFICE系统测试。

第四套:VBA代码解决方案之视频 是专门面向初学者的视频讲解,可以快速入门,更快的掌握这门技能。这套教程是第一套教程(修订一版)的视频讲解,听元音更易接受。这套教程还会额外提供通过32位和64位两种OFFICE系统测试的程序文件。

第五套:VBA中类的解读和利用 这是一部高级教程,讲解类的虚无与肉身的度化,类的利用虽然较少,但仔细的学习可以促进自己VBA理论的提高。这套教程的领会主要是读者的领悟了,领悟一种佛学的哲理。

第六套教程:《VBA信息获取与处理》,这是一部高级教程,涉及范围更广,实用性更强,面向中高级人员。教程共二十个专题,包括:跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互联网数据抓取、VBA延时操作,剪切板应用、Split函数扩展、工作表信息与其他应用交互,FSO对象的利用、工作表及文件夹信息的获取、图形信息的获取以及定制工作表信息函数等等内容。

上述教程的学习顺序:1→3→2→6→5或者4→3→2→6→5。提供的程序文件更是一座巨大的代码库,供读者使用,如需要可以WeChat: NZ9668

学习VBA是个过程,也需要经历一种枯燥的感觉"众鸟高飞尽,孤云独去闲。相看两不厌,只有敬亭山"。学习的过程也是修心的过程,修一个平静的心。在代码的世界中,心平静了,心情好了,身体自然而然就好。心静则正,内心里没有那么多邪知邪见,也就没有那么多妄想。利人就是利己。我的教程助力给正在努力的朋友。

"水善利万物而不争",绵绵密密,微则无声,巨则汹涌。学习亦如此,知道什么是自己所需要的,不要蜷缩在一小块自认为天堂的世界里,待到暮年时再去做自欺欺人的言论。要努力提高自己,用一颗充满生机的心灵,把握现在,这才是进取。越是有意义的事情,困难会越多。愿力决定始终,智慧决定成败。不管遇到什么,都是风景。看淡纷争,看轻得失。学习时微而无声,利用时则巨则汹涌。"路漫漫其修远兮,吾将上下而求索"

每一分收获都是成长的记录,怎无凭,正是这种执着,成就了朝霞的灿烂。最后将一阙词送给致力于VBA学习的朋友,让大家感受一下学习过程的枯燥与执着:

浮云掠过,暗语无声,

唯有清风,惊了梦中啼莺。

望星,疏移北斗,

奈将往事雁同行。

阡陌人,昏灯明暗,

忍顾长亭。

多少VBA人,

暗夜中,悄声寻梦,盼却天明。

怎无凭!

分享我多年工作实际经验的成果,随喜这些有用的东西,给确实需要利用VBA的同路人。回向学习利用VBA的历历往事,不胜感慨,谨以这些文字以纪念,

分享成果,随喜正能量

本文标签:函数Clipboard剪贴板

原文链接:https://www.xgfox.com/bcrm/71.html

本文版权:如无特别标注,本站文章均为原创。