说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

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

HTML文档下载 WORD文档下载 PDF文档下载
VB与Windows资源管理器互拷文件
作者:长沙 陈锐


   通过VB编程来拷贝或移动文件的原理可能大家都十分清楚,可以利用Windows APISHFileOperation来进行操作,也可以利用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))
   '将文件全路径名拷贝到分配的内存中。
   Call CopyMem(ByVal (lpGlobal + Len(df)), ByVal data, _
   Len(data))
   Call GlobalUnlock(hGlobal)
   '将数据拷贝到剪贴板上
   If SetClipboardData(CF_HDROP, hGlobal) Then
   clipCopyFiles = True
   End If
   End If
   Call CloseClipboard
   End If
  End Function
  Public Function clipPasteFiles(Files() As String) As Long
   Dim hDrop As Long
   Dim nFiles As Long
   Dim i As Long
   Dim desc As String
   Dim filename As String
   Dim pt As POINTAPI
   Dim tfStr As SHFILEOPSTRUCT
   Const MAX_PATH As Long = 260
   '确定剪贴板的数据格式是文件,并打开剪贴板
   If IsClipboardFormatAvailable(CF_HDROP) Then
   If OpenClipboard(0&) Then
   hDrop = GetClipboardData(CF_HDROP)
   '获得文件数
   nFiles = DragQueryFile(hDrop, -1&, “", 0)
   ReDim Files(0 To nFiles - 1) As String
   filename = Space(MAX_PATH)
   '确定执行的操作类型为拷贝操作
   tfStr.wFunc = FO_COPY
   '目的路径设置为File1指定的路径
   tfStr.pTo = Form1.File1.Path
   For i = 0 To nFiles - 1
   '根据获取的每一个文件执行文件拷贝操作
   Call DragQueryFile(hDrop, i, filename, Len(filename))
   Files(i) = TrimNull(filename)
   tfStr.pFrom = Files(i)
   SHFileOperation tfStr
   Next i
   Form1.File1.Refresh
   Form1.Dir1.Refresh
   Call CloseClipboard
   End If
   clipPasteFiles = nFiles
   End If
  End Function
  Private Function TrimNull(ByVal StrIn As String) As String
   Dim nul As Long
   nul = InStr(StrIn, vbNullChar)
   Select Case nul
   Case Is > 1
   TrimNull = Left(StrIn, nul - 1)
   Case 1
   TrimNull = “"
   Case 0
   TrimNull = Trim(StrIn)
   End Select
  End Function
   2、在Form1中加入一个FileListBox,Name属性设置为File1。加入一个DirListBox,Name属性设置为Dir1,在Dir1的Change事件中加入如下代码:
  Private Sub Dir1_Change()
  File1.Path = Dir1.Path
  End Sub
  加入一个DriveListBox,Name属性设置为Drive1,在Drive1的Change事件中加入如下代码:
  Private Sub Drive1_Change()
  Dir1.Path = Drive1.Drive
  End Sub
  加入一个CommandButton,Name属性设置为cmdCopy,在cmdCopy的Click事件中加入如下代码:
  Private Sub cmdCopy_Click()
   Dim Files() As String
   Dim Path As String
   Dim i As Long, n As Long
   Path = Dir1.Path
   If Right(Path, 1) <> “\" Then
   Path = Path & “\"
   End If
   '根据在List1上的选择建立拷贝文件的列表
   With File1
   For i = 0 To .ListCount - 1
   If .Selected(i) Then
   ReDim Preserve Files(0 To n) As String
   Files(n) = Path & .List(i)
   n = n + 1
   End If
   Next i
   End With
   '拷贝文件到Clipboard
   If clipCopyFiles(Files) Then
   MsgBox “拷贝文件成功.", , “Success"
   Else
   MsgBox “无法拷贝文件……", , “Failure"
   End If
  End Sub
  加入一个CommandButton,Name属性设置为cmdPaste,在cmdPaste的Click事件中加入如
  下代码:
  Private Sub cmdPaste_Click()
   Dim Files() As String
   Dim nRet As Long
   Dim i As Long
   Dim msg As String
   nRet = clipPasteFiles(Files)
   If nRet Then
   For i = 0 To nRet - 1
   msg = msg & Files(i) & vbCrLf
   Next i
   MsgBox msg, , “共粘贴" & nRet & “个文件"
   Else
   MsgBox“从剪贴版粘贴文件错误", , “Failure"
   End If
  End Sub
  运行文件,在Windows 资源管理器中,选择文件,再在资源管理器菜单中选 编辑 | 复制然后在Form1中点击cmdPaste,从资源管理器中复制的文件就拷贝到Dir1所在的目录中。从File1中选择文件,按cmdCopy复制,再在资源管理器中选 编辑 | 粘贴 ,选择的文件就被拷贝到Windows 资源管理器的当前目录下。
  上面的程序在Windows98 VB6.0下运行通过。


从AppGratis被下架说起,苹果或将再次付出代价 58同城的“烦恼”——8K月薪安全工程师引发的入侵 软件开发实践的24条军规 思科 IBM 微软等巨头联合开发开源SDN项目OpenDaylight 巾帼不让须眉:2012年度云计算领域Top 10女性 中移动全力推进NFC 5月起乘公交可刷手机 支持Android与iOS,Qt 5.1 Alpha全新亮相 Google Play:劣质Android应用已无藏身之地! 360推出信用网站认证开放平台 联合百家协会围剿钓鱼网站 经验分享:百度测试架构师眼中的百度QA(一) 在线旅行服务行业开放API带来的新机遇 专访:悬疑恐怖游戏Year Walk美术及音效设计师 解密:微软都柏林数据中心的神秘“免费冷却”装置 云计算如何影响数字化营销? 榜单:十位帮我们打理数据的存储大佬 OpenStack Grizzly版发布 Comcast、CERN成为新会员 谷歌携Blink来势汹汹 WebKit将成明日黄花? 星巴克与苹果合作 顾客可免费下载付费App 微信回应信令争议 将启动2.5G网络优化计划 凤凰网CTO吴华鹏离职 先后供职长达10年 外媒:开发者每周编码时间仅19.1小时 AppGratis CEO现身说法:应用被苹果儆杀始末 一个Web设计师眼里的云计算 戴尔高管:服务器业务领先惠普五年时间 Hoodie:基于JS与CouchDB的超快速Web开发框架 设计优秀API的五大规则 盘点英特尔IDF2013第一天:技术产品新趋势 英雄组队去打怪!Nimble Quest开发团队访谈 云通讯平台打造本土Twilio 被逼无奈?传微软或明年秋发布iOS和Android版Office 欧洲各国政府将向大众开放公共数据 各位,那里有VisualAge for Java4.0下在?我从ibm的网站上下载了,但是安装不了,说是语言不对! shcv.dll 编译不过去!!!!! have a test!have a test!have a test!have a test!have a test!have a test!have a test!have a test! mysql 结果中再次查询如何才能实现呢 pc2phone java支持byte[] a = String.getBytes("iso-8859-1");转换吗? c语言中关于对windows命令调用的语法、命令及其格式。 怎么样捕捉数据库连接出错的信息?? 在SQL语句中,如何获得一汉字字段的字节长度,而不是字符长度?如“测试”返回4,不是2 如何建树 winsock.dll提供的都是什么函数?如果它提供的是winsockAPI,那么winsock32。lib提供的又是些什么?它们重复吗? FormatDateTime这个函数的日期间的字符不支持汉字,怎么解决? 关于用JAVA生成GIF的问题?(16M的GIF,256的我已经知道了) 如何在ACCESS李使用SQL? 梦天请进,谢谢! 能不能将对象序列化后存到数据库再取出还原?有没有例子? 分屏的已个视要做成对话框,请指教,顺便告诉我如何给分,只能给这么多 sorry,梦天进来,thanks!! 急!请问怎么在java类里写编译另一个类的语句?? 如何在ACCESS里使用SQL? 谁有BO2K源代码,我愿高分求购.不为别的目的,只为深入学习系统编程 如何实现 调用IE打开一个页面,并且多次调用,只打开一个窗口? 帮我点一下我就给分! 一个简单问题:我在给Access数据表中增加记录,其中一字段是CTime类型,但老是非法操作。调试后错误出现是:return (GetLocalTm(NULL)->tm_year) + 1900 不知如何解决。请各位大师救救我把。 动态的保存datawindow object的问题 怎么给一个(tab control)属性单 的标题栏上给添加一个背景位图呢! 千山一刀之忍者神龟进来拿分!!! 怎样得到年、月、日的值 那里有C++ Primer这本书 十万火急!!!怎么在oracle+developer2k中取得本机ip.——高分奉上!! 如何判断输入的信息是中文? dll调用找不到程序入口?? 怎么用win2000来制作一张可以代光盘启动的启动盘 我怎么用一个ALT 封装一个 ToolBar Control的 ActiveX的控件! 谁有什么好的例子吗! 给个意见,是联通好呢?还是移动好? Paramstr如何正确处理带空格的参数? 我在表中插入记录可流览时却见不到新插入的记录只有关闭程序然后重新运行才能看见新插入的记录. 用awt控件制作的下拉菜单,为什么在IE环境下无法正常显示? 请CommerceServer(商业秘密[::路德一族::])luojx(大鱼儿)koyia(koyia) 三位高手再去谁能单独解决~谁能独享100分!绝不食言(再详细点!)) 怎样让程序只运行一次? 怎样合并两个EXE文件? 把数据库表转换成文本文件,有什么好办法吗/ 怎么才能当鼠标移到表格上,然后表格的颜色改变 请kylincn(随心所欲),lianghu(山人)进来拿分; 另外 斑竹帮我给分http://www.csdn.net/expert/topic/389/389544.shtm 哪儿可以找到一些游戏的算法 我快疯了!!!! 谁用过FAST REPORT 请求帮助!!! 在delphi中,怎样判断edit控件中填入的是不是数字?怎样给edit控件加长度限制? 300分求带BDE的安装程序的详细制作方法。别名到底怎么设置吗? 怎样在状态栏中显示进度条? 阴影部分的面积是5平方米求环形的面积是多少 两个4次多项式相加 四级各项分值是多少?比如,一道听力多少分?一道阅读多少?然后总的,比如作文总分多少,阅读总分多少? 看到一个背单词的诀窍,背单词的诀窍:首先Z,Y,X,Q,J,K,U,然后V,W,N,O,L,接着B,D或E,R或F,G或T,I或H,M,最后挑战BOSS:C,P,A,S,不久你会发现,在英语的世界里,单词会主动认识你. 两个多项式相加后,不含一次项,是什么意思 什么是多项式(项,次数) 下图中阴影的面积是5平方分米,求圆环的面积 两个一元多项式相加我想要一个C++的源程序最好有主函数要多点注释错了,不是这样的,我需要的是输入两个一元多项式,两个多项式相加合并,输出一条链. 在多项式中,次数最高的项的次数,就是这个多项式的( ) 空调作用原理 有一个自然数含有10个不同的约数,但质约数只有2和3,那么,这个自然数最大是 一个面积为300平方米的正方形,边长是多少一个圆形草地平均分成四份,每一份的图形就是度数为90°的扇形.然后题目又说这个圆的半径等于一个正方形的边长,正方形的面积是300平方米,这个正 右图中阴影部分的面积是40平方米,求环形的面积 已知右图阴影部分的面积是25.12平方米,小圆的半径是3米,求正方形的面积36页36页 正方形的面积是300平方米,它的边长是多少?这道题完整的是:下图中正方形部分是一个水池(水池的一个点在圆形草坪的圆心上)其余全是草坪,已知正方形的面积是300平方米,草坪的面积 1.5v干电池电压升到4V驱动发光二极管,求详细的原理 已知下图阴影部分的面积是50.24平方米,小圆的半径是3米,正方形的面积是多少? 面积是300平方米的正方形,边长是多少? 帮我做一下,阴影部分的面积是20平方厘米,求环形的面积是多少平方米?图片上传不了 设S为整数,则所有奇数可表示为( ),所有偶数可表示为( ),所有被3除余2的数可表示为( ) 一个正方形水池的面积是300平方米其余是草坪,求草坪的面积 下图中阴影部分的面积为5平方厘米 求环形面积·求高手如题 已知下图阴影部分的面积是50.24m²,小圆的半径是3 m.正方形的面积是多少平方米? 2009年12月四级成绩错误437听力:106阅读:181综合:61写作:89大家认为听力成绩是不是错了……个人感觉我听力还是很不错的,据说最低分也就90我不会那么差吧 世界大学排名前一百名?求2010年最新数据!亚洲的占多少?中国的占多少?权威报告 已知n表示任何一个整数,则用n表示偶数为 ? 奇数为? 被3除余2的数是 两个连续整数之和是? 英语四级总分多少?各题的详细分数是多少?我要2013年12月的 编写VB程序 输出1至100(包括1和100)内能被7整除的所有整数用 循环语句 编写WHILE 或者 UNTIL 已知下图阴影部分面积是50.24平方米,小圆的半径是3m,正方形面积是多少?急用 2009年12月英语四级成绩 我刚查的四级成绩,太扯淡了,才366.就算我胡写也不可能就这点分.这个可以申请查卷不?怎么查?觉得自己成绩有问题的朋友就留个言,看看有多少有问题 关于余数定理的问题~多项式余数定理是指一个多项式 f(x) 除以一线性多项式 x - a 的余数是 f(a).例如,(5x3 + 4x2 - 12x + 1) / (x - 3) 的余数是 5(3)3 + 4(3)2 - 12(3) + 1 = 136这里x=3,这样分母不就为0了吗?我 有一个自然数含有10个不同的约数,但质因数只有两种:2和3.这个自然数最大是 所有偶数都可以用2n来表示(n为整数),请你表示出所有的奇数和所有被5除余2的数 余数定理问题已知f(x)除以x-n/m的余数是k,那么f(x)除以mx-n的余数是?为什么答案依为k,如果可以详细,能不能给我具体深入讲一下,我才学余数定理请说具体点, 91的92次幂 除以100的余数 二项式定理解答 要求详细说明-919 怎么就算出 81的余数 已知下图阴影部分面积是50.24平方米,小圆的半径是3m,正方形面积是多少? 什么是中国余数定理? 1.化简(√2+1)^5+(√2-1)^5= 2.利用二项式定理证明命题:15^8-1能被64整除 3.67^200除以9所得的余数是PS:67^200意为:67的200次方 设n为整数,则奇数可表示为,三个连续偶数中设中间的数为x,则其余两个偶数可表示为? 余数定理高手进1.已知关于X的整式能被X+3整除;除以X+2,X-3时,余数分别是-4,6,求满足上述条件的次数最低的整式2.已知F(X)=X的三次方+2X的二次方+3X+2除一整系数多项式G(X)所的的商式及余 英语四级各题的具体分值? 什么是多项式?并举例说明.并举例说明,如果A是六次多项式,B是四次多项式,那么A+B是六次多项式,A-B是四次多项式. 阴影部分的面积是25平方米,求圆环的面积 下图中圆的半径是2厘米,长方形长与宽的比是3比2,求阴影部分的面积 什么是"对称多项式"?什么是"轮换多项式"?它们的区别和联系是什么?能举例说明吗?哪位GGJJ知道请告诉我,如果有它们的性质及证明最好,如果是附件的形式,就请给发到pigdai@163.com. 下图中阴影部分的面积是25平方厘米,你能算出环形的面积是多少吗? 已知下图中的长方形长是8厘米,宽是4厘米,求阴影部分的面积 CET4的分数是怎么分布我的作文怎么会有115呢,不是说作文的总分才106吗? 阴影面积是25平方米求圆环面积 求下图中阴影部分的面积,长方形长是8米,宽是4米 正方形的面积是300平方米 阴影面积是? 下图中阴影的面积是25平方厘米,请你求出环形面积 下图中的长方形长10厘米宽8厘米,三角形甲和乙的面积都是长方形面积的1/4,求阴影部分的面积 计算图中阴影部分的面积 圆外的正方形的1/4是300㎡ 一个弧形的面积第一题:第二题 阴影部分面积25平方米,求环形面积 1.能被3整除的最大两位奇数是( ) 2.能被3整除的最小两位偶数是( ) 3.个位0又是3的倍数的两位数是( )4.能被3和5整除的最大两位奇数是( ) C语言 请编程求【1,5000】间能被3整除但不能被5整除的偶数有多少个? 请问SAT2数学中高次多项式函数的五个定理详细解释 两个五次多项式相加后A.十次多项式B.五次多项式C.次数不低于五次的多项式D.次数不高于五次的整式 英语四级各项分数分别是多少?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn