ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 2666|回复: 14

[分享] 将单个或多个文件复制/剪切到剪切板源码(兼容64位/32位)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2021-4-2 11:06 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖已被收录到知识树中,索引项:图像处理和GDI
本帖最后由 joforn 于 2021-4-2 11:08 编辑

这是一段共享了很长时间的古老代码了,原来不支持64位系统,有些小伙伴自己不会修改成兼容64位代码,在私信中问,一下子又没找不到他的帖子,只好重新发送共享


  1.     '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  2.     '>>>>>>>>   Author:       Joforn                          <<<<<<<<<<<<<<<<<<
  3.     '>>>>>>>>   Email:        [email]Joforn@sohu.com[/email]                 <<<<<<<<<<<<<<<<<<
  4.     '>>>>>>>>   QQ:           42978116                        <<<<<<<<<<<<<<<<<<
  5.     '>>>>>>>>   Create time:  04/11/2012                      <<<<<<<<<<<<<<<<<<
  6.     '>>>>>>>>   Last time :   04/02/2021                      <<<<<<<<<<<<<<<<<<
  7.     '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

  8.     Option Explicit

  9.     '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  10.     '>\\\\\\\\\\\\\\\\\\\\\\\     API函数定义开始      /////////////////////////<
  11.     '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  12.     #If VBA7 Then
  13.       Private Declare PtrSafe Function RegisterClipboardFormat Lib "user32.dll" Alias "RegisterClipboardFormatW" (ByVal lpString As LongPtr) As Long
  14.       Private Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hWnd As LongPtr) As Long
  15.       Private Declare PtrSafe Function CloseClipboard Lib "user32" () As Long
  16.       Private Declare PtrSafe Function SetClipboardData Lib "user32" (ByVal wFormat As Long, ByVal hMem As LongPtr) As Long
  17.       Private Declare PtrSafe Function EmptyClipboard Lib "user32" () As Long
  18.       Private Declare PtrSafe Function GlobalLock Lib "KERNEL32" (ByVal hMem As LongPtr) As LongPtr
  19.       Private Declare PtrSafe Function GlobalUnlock Lib "KERNEL32" (ByVal hMem As LongPtr) As Long
  20.       Private Declare PtrSafe Function GlobalAlloc Lib "KERNEL32" (ByVal flags As Long, ByVal Size As Long) As LongPtr
  21.       Private Declare PtrSafe Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" (ByVal hpvDest As LongPtr, ByVal hpvSource As LongPtr, ByVal cbCopy As Long)
  22.     #Else
  23.       Private Declare Function RegisterClipboardFormat Lib "user32.dll" Alias "RegisterClipboardFormatW" (ByVal lpString As Long) As Long
  24.       Private Declare Function OpenClipboard Lib "user32" (ByVal hWnd As Long) As Long
  25.       Private Declare Function CloseClipboard Lib "user32" () As Long
  26.       Private Declare Function SetClipboardData Lib "user32" (ByVal wFormat As Long, ByVal hMem As Long) As Long
  27.       Private Declare Function EmptyClipboard Lib "user32" () As Long
  28.       Private Declare Function GlobalLock Lib "KERNEL32" (ByVal hMem As Long) As Long
  29.       Private Declare Function GlobalUnlock Lib "KERNEL32" (ByVal hMem As Long) As Long
  30.       Private Declare Function GlobalAlloc Lib "KERNEL32" (ByVal flags As Long, ByVal Size As Long) As Long
  31.       Private Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" (Byval hpvDest As Long,Byval hpvSource As Long, ByVal cbCopy As Long)
  32.     #End If
  33.     '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  34.     '>\\\\\\\\\\\\\\\\\\\\\\\     API函数定义结束      /////////////////////////<
  35.     '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

  36.     Private Const CF_HDROP As Long = 15&
  37.     Private Const DROPEFFECT_COPY As Long = 1
  38.     Private Const DROPEFFECT_MOVE As Long = 2
  39.     Private Const GMEM_ZEROINIT As Long = &H40
  40.     Private Const GMEM_MOVEABLE As Long = &H2
  41.     Private Const GMEM_DDESHARE As Long = &H2000


  42.     '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  43.     '>\\\\\\\\\\\\\\\\\\\\\\\      结构定义开始        /////////////////////////<
  44.     '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  45.     Private Type POINTAPI
  46.         X As Long
  47.         Y As Long
  48.     End Type
  49.    
  50.     Private Type dropFiles
  51.       pFiles  As Long
  52.       pt      As POINTAPI
  53.       fNC     As Long
  54.       fWide   As Long
  55.     End Type

  56.     '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  57.     '>\\\\\\\\\\\\\\\\\\\\\\\      结构定义结束         ////////////////////////<
  58.     '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<


  59.     Public Function CutOrCopyFiles(FileList As Variant, Optional ByVal CopyMode As Boolean = True) As Boolean
  60.       Dim uDropEffect As Long, I As Long
  61.       Dim dropFiles   As dropFiles
  62.       Dim uGblLen     As Long, uDropFilesLen  As Long
  63.       #If VBA7 Then
  64.         Dim hGblFiles   As LongPtr
  65.         Dim hGblEffect  As LongPtr
  66.         Dim mPtr        As LongPtr
  67.       #Else
  68.         Dim hGblFiles   As Long
  69.         Dim hGblEffect  As Long
  70.         Dim mPtr        As Long
  71.       #End If
  72.       Dim FileNames   As String
  73.       
  74.       If OpenClipboard(0) Then
  75.         EmptyClipboard
  76.         FileNames = GetFileListString(FileList)
  77.         If Len(FileNames) Then
  78.           uDropEffect = RegisterClipboardFormat(StrPtr("Preferred DropEffect"))
  79.           hGblEffect = GlobalAlloc(GMEM_ZEROINIT Or GMEM_MOVEABLE Or GMEM_DDESHARE, Len(uDropEffect))
  80.           mPtr = GlobalLock(hGblEffect)
  81.           I = IIf(CopyMode, DROPEFFECT_COPY, DROPEFFECT_MOVE)
  82.           CopyMemory mPtr, VarPtr(I), Len(I)
  83.           GlobalUnlock hGblEffect
  84.           SetClipboardData uDropEffect, hGblEffect
  85.          
  86.           uDropFilesLen = LenB(dropFiles)
  87.           With dropFiles
  88.             .pFiles = uDropFilesLen
  89.             .fWide = CLng(True)
  90.           End With
  91.           uGblLen = uDropFilesLen + LenB(FileNames) + 8
  92.           hGblFiles = GlobalAlloc(GMEM_ZEROINIT Or GMEM_MOVEABLE Or GMEM_DDESHARE, uGblLen)
  93.           mPtr = GlobalLock(hGblFiles)
  94.           CopyMemory mPtr, VarPtr(dropFiles), uDropFilesLen
  95.           mPtr = mPtr + uDropFilesLen
  96.           hGblEffect = StrPtr(FileNames)
  97.           I = LenB(FileNames)
  98.           CopyMemory mPtr, hGblEffect, I
  99.          
  100.           GlobalUnlock hGblFiles
  101.           SetClipboardData CF_HDROP, hGblFiles
  102.         End If
  103.         CloseClipboard
  104.       End If
  105.     End Function

  106.     Private Function GetFileListString(FileList As Variant) As String
  107.       Dim I As Long
  108.       
  109.       On Error GoTo GetFileListStringLOOP
  110.       Select Case VarType(FileList)
  111.         Case vbString
  112.           GetFileListString = Trim$(FileList)
  113.         Case &H2008
  114.           For I = LBound(FileList) To UBound(FileList)
  115.             FileList(I) = Trim$(FileList(I))
  116.             If Len(FileList(I)) Then GetFileListString = GetFileListString & FileList(I) & vbNullChar
  117.           Next I
  118.           If Len(GetFileListString) Then GetFileListString = Left$(GetFileListString, Len(GetFileListString) - 1)
  119.       End Select
  120. GetFileListStringLOOP:
  121.     End Function


  122. Sub Test2Files()
  123.   Dim FileList() As String
  124.   
  125.   ReDim FileList(0 To 1)
  126.   FileList(0) = "C:\Windows\regedit.exe"
  127.   FileList(1) = "C:\Windows\system32\gpedit.msc"
  128.   CutOrCopyFiles FileList
  129. End Sub

  130. Sub Test1File()
  131.   CutOrCopyFiles "C:\Windows\regedit.exe"
  132. End Sub

复制代码

运行Test1File或Test2Files后,在Explorer中点右键粘贴可见效果。


评分

7

查看全部评分

TA的精华主题

TA的得分主题

发表于 2021-4-2 14:12 | 显示全部楼层
我就是那个小伙伴,解决了悬了很久的问题,感谢楼主。这个功能对我太方便,太重要了,然而我对API一无所知。在32位系统用了很久到了64位突然用不了,每次要复制都要跑到文件夹里找很窝火。我一开始以为Joforn 是老外,原来是论坛里的大神,膜拜膜拜。谢谢谢谢谢过,以后还有很多跟系统兼容有关的问题想向楼主请教!!!

TA的精华主题

TA的得分主题

发表于 2021-6-9 16:19 | 显示全部楼层
这个复制动作能改成ctrl+c就完美了

TA的精华主题

TA的得分主题

发表于 2021-9-23 15:33 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
楼主,能解释下dropFiles的数据结构吗,初看代码,不是很懂

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-9-23 16:06 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2021-9-23 17:52 来自手机 | 显示全部楼层
本帖最后由 lilyhcn1 于 2021-9-23 18:50 编辑

收回我原来的话。

果然可以复制文件,另外居然没有一个杀毒软件报毒。 佩服

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-9-23 17:58 | 显示全部楼层
lilyhcn1 发表于 2021-9-23 17:52
我猜很多软件会报毒

光猜是没有用的,试试就知道了。
如果这段小代码都报毒,那么那个杀毒软件基本已经倒闭了。

TA的精华主题

TA的得分主题

发表于 2022-5-10 15:23 | 显示全部楼层
应用到微信给别人发文件。不过代码看不懂。RegisterClipboardFormat(StrPtr("Preferred DropEffect")),RegisterClipboardFormat 注册类型可以改成别的吧?

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-5-10 17:55 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
zhponer 发表于 2022-5-10 15:23
应用到微信给别人发文件。不过代码看不懂。RegisterClipboardFormat(StrPtr("Preferred DropEffect")),Reg ...

可以,但是要目标程序能够识别

TA的精华主题

TA的得分主题

发表于 2022-10-18 00:02 | 显示全部楼层
众里寻他千百度,蓦然回首,那人却在灯火阑珊处。谢谢楼主
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-21 07:09 , Processed in 0.041364 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表