如何用EnumClipboardFormats枚举剪贴板格式?

api函数EnumClipboardFormats可以枚举剪贴板中已有的数据格式,它的语法如下:

UINT WINAPI EnumClipboardFormats(

  _In_ UINT format

);

当第一次调用EnumClipboardFormats函数时,把format参数设置为0,它的返回值为剪贴板中第一个数据格式,如果剪贴板中没有数据,则返回0。如果要继续枚举其它的剪贴板数据格式,则把format参数设置为上次的函数返回值,直到枚举结束,EnumClipboardFormats函数的返回值为0。

剪贴板中可以存放各种各样的数据,它们都有着对应的格式,如果要查看剪贴板中已有的数据格式,可以使用如下的vba代码:

Declare Function EnumClipboardFormats Lib "user32" (ByVal wFormat As Long) As Long
Declare Function OpenClipboard Lib "user32" (ByVal hWnd As Long) As Long
Declare Function CloseClipboard Lib "user32" () As Long
Enum ClipboardFormats
    CF_TEXT = 1
    CF_BITMAP = 2
    CF_METAFILEPICT = 3
    CF_SYLK = 4
    CF_DIF = 5
    CF_TIFF = 6
    CF_OEMTEXT = 7
    CF_DIB = 8
    CF_PALETTE = 9
    CF_PENDATA = 10
    CF_RIFF = 11
    CF_WAVE = 12
    CF_UNICODETEXT = 13
    CF_ENHMETAFILE = 14
    CF_HDROP = 15
    CF_LOCALE = 16
    CF_DIBV5 = 17
    CF_OWNERDISPLAY = &H80
    CF_DSPTEXT = &H81
    CF_DSPBITMAP = &H82
    CF_DSPMETAFILEPICT = &H83
    CF_DSPENHMETAFILE = &H8E
    CF_GDIOBJFIRST = &H300
    CF_PRIVATEFIRST = &H200
    CF_PRIVATELAST = &H2FF
    CF_GDIOBJLAST = &H3FF
End Enum
Sub QQ1722187970()
    Dim iFormat
    OpenClipboard (0)
    iFormat = EnumClipboardFormats(0)
    Debug.Print iFormat
    Do Until iFormat = 0
      iFormat = EnumClipboardFormats(iFormat)
      Debug.Print iFormat
    Loop
    CloseClipboard
End Sub

当我们复制一个excel单元格内容到剪贴板时,使用以上的代码枚举剪贴板的格式,发现会出来一串格式,并不是我们想象中的只有一种数据格式,这是因为剪贴板是用于在应用程序之间或者应用程序内部交换数据的,它存放一个数据内容时,会存放与这个数据内容相关的尽可能多的数据格式,这样就便于其它应用程序访问。

比如word里面的字符数据是有格式的,但是记事本里面的字符数据是没有格式。所以当在word中复制数据时,它会往剪贴板中粘贴这个数据的各种数据格式,其中第一个是包含有这个数据最多信息的数据格式(带了word格式),然后是逐渐减少信息的数据格式,这样当记事本获取剪贴板数据时,就只寻找自己可以接受的数据格式即可。

       

发表评论