获取从“资源管理器”发送到 Clipboard 里面的文件列表

博客介绍了在VB中获取和设置剪贴板文件列表的方法。从资源管理器复制/剪贴文件时,文件列表存于剪贴板。通过新建类模块添加代码,可实现获取文件列表及判断复制或剪贴情况,还给出了相关函数和常量的定义及使用。

当从“资源管理器”复制/剪贴文件时,文件列表会被存放到“剪贴板”Clipboard。可以用下面的程序获取得这时的文件列表,包括是“复制”还是“剪贴”的情况。

 

在VB里面新建一个类模块,添加如下的代码即可。

 

'//本文由 Virtualalloc 原创,转载请注明出处。

Private Type POINTAPI
    x       As Long
    y       As Long
End Type

Private Type DROPFILES
    pFiles  As Long
    pt      As POINTAPI
    fNC     As Long
    fWide   As Long
End Type


'//global memory
Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSrc As Any, ByVal ByteLen As Long)

'clipboard
Private Declare Function SetClipboardData Lib "user32" (ByVal wFormat As Long, ByVal hMem As Long) As Long
Private Declare Function EmptyClipboard Lib "user32" () As Long
Private Declare Function RegisterClipboardFormat Lib "user32" Alias "RegisterClipboardFormatA" (ByVal lpString As String) As Long
Private Declare Function IsClipboardFormatAvailable Lib "user32" (ByVal wFormat As Long) As Long
Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function DragQueryFile Lib "shell32.dll" Alias "DragQueryFileA" (ByVal hDrop As Long, ByVal iFile As Long, ByVal lpszFile As String, ByVal cch As Long) As Long

Public Enum FileDropEffectConstants
  fdDropEffectNone = 0
  fdDropEffectCopy = 1
  fdDropEffectMove = 2
  fdDropEffectLink = 4
End Enum


'//Clipboard Formats
Private Const CF_TEXT = 1
Private Const CF_BITMAP = 2
Private Const CF_METAFILEPICT = 3
Private Const CF_SYLK = 4
Private Const CF_DIF = 5
Private Const CF_TIFF = 6
Private Const CF_OEMTEXT = 7
Private Const CF_DIB = 8
Private Const CF_PALETTE = 9
Private Const CF_PENDATA = 10
Private Const CF_RIFF = 11
Private Const CF_WAVE = 12
Private Const CF_UNICODETEXT = 13
Private Const CF_ENHMETAFILE = 14
Private Const CF_HDROP = 15
Private Const CF_LOCALE = 16
Private Const CF_MAX = 17

'other clipboard formats
Private Const CFSTR_SHELLIDLIST As String = "Shell IDList Array"
Private Const CFSTR_SHELLIDLISTOFFSET As String = "Shell Object Offsets"
Private Const CFSTR_NETRESOURCES As String = "Net Resource"
Private Const CFSTR_FILEDESCRIPTOR As String = "FileGroupDescriptor"
Private Const CFSTR_FILECONTENTS As String = "FileContents"
Private Const CFSTR_FILENAME As String = "FileName"
Private Const CFSTR_PRINTERGROUP As String = "PrinterFriendlyName"
Private Const CFSTR_FILENAMEMAP As String = "FileNameMap"

Private Const CFSTR_PREFERREDDROPEFFECT As String = "Preferred DropEffect"

'global memory
Private Const GMEM_FIXED = &H0
Private Const GMEM_MOVEABLE = &H2
Private Const GMEM_NOCOMPACT = &H10
Private Const GMEM_NODISCARD = &H20
Private Const GMEM_ZEROINIT = &H40
Private Const GMEM_MODIFY = &H80
Private Const GMEM_DISCARDABLE = &H100
Private Const GMEM_NOT_BANKED = &H1000
Private Const GMEM_SHARE = &H2000
Private Const GMEM_DDESHARE = &H2000
Private Const GMEM_NOTIFY = &H4000
Private Const GMEM_LOWER = GMEM_NOT_BANKED
Private Const GMEM_VALID_FLAGS = &H7F72
Private Const GMEM_INVALID_HANDLE = &H8000
Private Const GHND = (GMEM_MOVEABLE Or GMEM_ZEROINIT)
Private Const GPTR = (GMEM_FIXED Or GMEM_ZEROINIT)

 

Public Function ClipboardSetFiles(sfiles() As String, ByVal lcount As Long) As Boolean
'//send files to clipboard
   
    Dim sTmp        As String
    Dim dfs         As DROPFILES
    Dim hGlobal     As Long
    Dim lpGlobal    As Long
    Dim i           As Long
   
    '//Open clipboard
    If OpenClipboard(0) Then
   
        EmptyClipboard  'empty clipboard
       
        '//combine files
        For i = 0 To lcount - 1
            sTmp = sTmp & sfiles(i) & vbNullChar
        Next
        sTmp = sTmp & vbNullChar
       
        hGlobal = GlobalAlloc(GHND, Len(dfs) + Len(sTmp)) 'Allocate
       
        If hGlobal Then
           
            '//make DROPFILES
            lpGlobal = GlobalLock(hGlobal)
            dfs.pFiles = Len(dfs)
            CopyMemory ByVal lpGlobal, dfs, Len(dfs)
            CopyMemory ByVal lpGlobal + Len(dfs), ByVal sTmp, Len(sTmp)
            GlobalUnlock hGlobal
           
            ClipboardSetFiles = SetClipboardData(CF_HDROP, hGlobal) 'copy sTmp to clipboard
        End If
       
        CloseClipboard  'close
    End If
   
End Function

Public Function ClipboardGetFiles(sfiles() As String, lcount As Long, _
                Optional ByRef DropEffect As FileDropEffectConstants) As Boolean
               
'//get files from clipboard

    '//If Clipboard.GetFormat(vbCFFiles) Then........
   
    Dim hDrop        As Long
    Dim sTmp         As String
    Dim i            As Long
   
    Const MAX_PATH As Long = 260
   
    '//open clipboard
    If IsClipboardFormatAvailable(CF_HDROP) Then
        If OpenClipboard(0) Then
       
            'Get Filelist data
            hDrop = GetClipboardData(CF_HDROP)
            lcount = DragQueryFile(hDrop, -1, vbNullString, 0)
           
            'file entries
            lcount = lcount
            ReDim sfiles(lcount - 1)
           
            sTmp = String(MAX_PATH, Chr(0))
           
            'get file
            For i = 0 To lcount - 1
                DragQueryFile hDrop, i, sTmp, MAX_PATH
                sfiles(i) = NullTrim(sTmp)
            Next i
           
            Dim lngFormat As Long
            Dim lngEffect As Long
           
            lngFormat = RegisterClipboardFormat(CFSTR_PREFERREDDROPEFFECT)
            hDrop = GetClipboardData(lngFormat)
           
            If (hDrop) Then
                CopyMemory lngEffect, ByVal hDrop, 4
                DropEffect = lngEffect
            End If
            'close
            Call CloseClipboard
            ClipboardGetFiles = True   'return
        End If
    End If
  
End Function


Private Function NullTrim(ByRef inString As String) As String
    Dim iPos As Integer
    iPos = InStr(inString, Chr$(0))
    If iPos > 0 Then
        NullTrim = Left$(inString, iPos - 1)
    Else
        NullTrim = inString
    End If
End Function

'//本文由 Virtualalloc 原创,转载请注明出处。

VF辅导:内存变量操作命令及文件操作命令 来源:学生大 2007年11月01日 11:35   一.内存变量操作命令:   1.显示内存变量:   格式:display memory [to printer][to 文本文件名]或      list memory [to printer][to 文本文件名]   说明:   (1).两条命令功能基本相同,仅在显示方式上有所区别,前者是分页显示,后者以滚动方式显示   (2).该命令用于显示已定义的内存变量   (3).加上to printer选项,将在屏幕上显示的同时,送往打印机打印   (4).也可加上"to 文本文件名"选项,在显示的同时将结果传送给指定的文本文件保存.   例:显示已存的内存变量   在命令窗口依次输入执行以下命令,观察结果   m=123.456   n="中国人"   list memory to e:\myvfp\bl.txt   执行完毕后,打开e:\myvfp,可以看到,里面多了一个b1.txt.   2.清除内存变量:   格式1:release 变量名表   格式2:release all [extended]   格式3:clear memory   说明:   (1).格式1清除变量名表指定的内存变量并释放它们所战胜的内存空间.   (2).格式2清除全部内存变量,但在程序中不清除全程变量,如有extended选项,则全程变量也清除.   (3).格式3清除除系统内存变量外的全程和局部内存变量,并释放它们的内存空间.   3.保存内存变量:   格式:save to 文件名   功能:将内存变量保存到指定的文件中   4.恢复内存变量:   格式:restore from 文件名   功能:从指定的文件中恢复内存变量   二.文件操作命令:vfp提供了许多文件操作命令,如文件的查找,打开,关闭,复制,更名及显示等.如果你不dos基础,你会发现,和dos命令有几分相象的.   1.显示文件目录命令:   格式:dir [盘符][路径][to printer]   例如:   dir e:  &&显示e:的表信息的内容   dir *.prg  &&显示当前盘的当前目录下所有扩展名为.prg的文件目录信息    2.关闭文件:   格式1:close all   格式2:close database   格式3:close database all   格式4:close index   格式5:close tables   功能:   (1).格式1关闭除"命令窗口","调试窗口","跟踪窗口"及"帮助窗口"以外的所有内容.   (2).格式2关闭当前数据库.数据库关闭后,与此数据库相关的东西同时关闭.若没有数据库,则该命令关闭所有工作区中打开的自由表及与此表相关的东西.   (3).格式3关闭所有打开的数据库及与此相关的东西.   (4).格式4关闭除结构化复合索引外的所有索引文件.   (5).格式5关闭所有打开的表及其索引文件,但不关闭数据库.   3.文件的复制:   格式:copy file 文件名1 to 文件名2   说明:   (1).该命令可复制任何类型的文件,但要求文件名必须加扩展名;   (2).该命令不能复制已打开的文件.   例:将d盘根目录下的xy子目录中的as.prg复制到A盘上,文件名不变:   copy file d:\xy\as.prg to a:\as.prg   4.文件更名:   格式:rename 文件名1 to 文件名2   说明:该命令用于给磁盘文件改名,文件名一般应带扩展名.如果文件不在当前目录中,应指定扩展名.对已打开的文件不能改名.改名的同时可以更换存放路径,例如:rename d:\xy\as.prg to e:\as1.prg   5.删除文件:   格式1:erase 文件名|   格式2:delete file 文件名|   说明:   (1).这两个命令都用于删除文件,完全相同.被删除的文件应事先关闭,文件名应带扩展名.如被删除的文件不在当前目录下,应指定路径名.文件名不不允许使用通配符.   (2).若选用问号"?",半打开对话框,可从中选择要删除的文件进行删除操作.例如,在命令窗口输入erase 回车,将弹出对话框.   6.显示文本文件:   格式:type 文本文件名 [to printer|to 输出文件名]   功能:执行该命令,将文本文件的内容输出到屏幕,窗口,打印机或一个文本文件.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值