日历

« 2009-01-06  
    123
45678910
11121314151617
18192021222324
25262728293031

RSS订阅

VB与Windows资源管理器互拷文件

2008-05-28 21:25:44 / 个人分类:转载网上VB编程

 

VB与Windows资源管理器互拷文件

    通过VB编程来拷贝或移动文件的原理可能大家都十分清楚,可以利用Windows API

SHFileOperation来进行操作,也可以利用VB内置的函数来操作。但是利用这些方法编

写的程序只能在程序内部执行文件的操作。这里我要向大家介绍如何通过VB编程将程序

中的文件操作同Windows的资源管理器中的拷贝、剪切操作连接起来。

    在Windows的资源管理器中,选中一个或多个文件,在文件上单击鼠标右键,在弹

出菜单中选复制。再切换到另外的目录,单击鼠标右键,点粘贴。就执行了一次文件的

拷贝操作,那么Windows在拷贝过程中执行了什么操作,是否将整个文件拷贝到剪贴版

上了呢?当然没有。实际上,windows只是将一个文件结构拷贝到了剪贴版,这个结构

如下:

    tDropFile+文件1文件名+vbNullChar文件2文件名+vbNullChar...+文件N文件名+vbNullChar

其中tDropFile是一个DROPFILES结构,这个结构在Windows API中有定义。在粘贴文件

时,利用API函数 DragQueryFile 就可以获得拷贝到剪贴版的文件全路径名,然后就

可以根据获得的文件名执行文件拷贝函数,实现对文件的粘贴操作。

    下面通过具体的程序来介绍:

    1、在工程文件中加入一个Module,然后在Module中加入如下代码:

Option Explicit

 

Private Type POINTAPI

   x As Long

   y As Long

End Type

 

Private Type SHFILEOPSTRUCT

    hwnd As Long

    wFunc As Long

    pFrom As String

    pTo As String

    fFlags As Integer

    fAnyOperationsAborted As Long

    hNameMappings As Long

    lpszProgressTitle As String

End Type

 

Private Declare Function SHFileOperation Lib "shell32.dll" Alias _

        "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long

 

'剪贴版处理函数

Private Declare Function EmptyClipboard Lib "user32" () As Long

Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd _

        As Long) As Long

Private Declare Function CloseClipboard Lib "user32" () As Long

Private Declare Function SetClipboardData Lib "user32" (ByVal wFormat _

        As Long, ByVal hMem As Long) As Long

Private Declare Function GetClipboardData Lib "user32" (ByVal wFormat _

        As Long) As Long

Private Declare Function IsClipboardFormatAvailable Lib "user32" _

        (ByVal wFormat As Long) As Long

 

Private Declare Function DragQueryFile Lib "shell32.dll" Alias _

        "DragQueryFileA" (ByVal hDrop As Long, ByVal UINT As Long, _

        ByVal lpStr As String, ByVal ch As Long) As Long

Private Declare Function DragQueryPoint Lib "shell32.dll" (ByVal _

        hDrop As Long, lpPoint As POINTAPI) As Long

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 CopyMem Lib "kernel32" Alias "RtlMoveMemory" _

        (Destination As Any, Source As Any, ByVal Length As Long)

 

'剪贴版数据格式定义

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

 

' 内存操作定义

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)

 

Private Const FO_COPY = &H2

 

Private Type DROPFILES

   pFiles As Long

   pt As POINTAPI

   fNC As Long

   fWide As Long

End Type

 

Public Function clipCopyFiles(Files() As String) As Boolean

   Dim data As String

   Dim df As DROPFILES

   Dim hGlobal As Long

   Dim lpGlobal As Long

   Dim i As Long

  

   '清除剪贴版中现存的数据

   If OpenClipboard(0&) Then

        Call EmptyClipboard

     

        For i = LBound(Files) To UBound(Files)

            data = data & Files(i) & vbNullChar

        Next i

        data = data & vbNullChar

 

        '为剪贴版拷贝操作分配相应大小的内存

        hGlobal = GlobalAlloc(GHND, Len(df) + Len(data))

        If hGlobal Then

            lpGlobal = GlobalLock(hGlobal)

        

            df.pFiles = Len(df)

     '将DropFiles结构拷贝到内存中

            Call CopyMem(ByVal lpGlobal, df, Len(df))

TAG: 转载网上VB编程

我来说两句

-5 -3 -1 - +1 +3 +5

Open Toolbar