VB 将长路径转为短路径 & 获取剪粘板中的文件的列表

这段VB代码演示了如何将长路径转换为短路径,并展示了如何获取剪贴板中图片文件的列表。通过`GetShortPathName`函数实现长路径转短路径,通过处理CF_HDROP格式的剪贴板数据来获取文件列表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

将长路径转为短路径

 

Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long
Private Function ShortPath(ByVal FileName As String) As String
Dim S As String
On Error GoTo exitFunc:
S = String(255, " ")
GetShortPathName FileName, S, 255
ShortPath = Left(S, InStr(S, Chr(0)) - 1)
exitFunc:
End Function

 

 

获取剪粘板中的图片文件的列表

 

  Private Const CF_HDROP = 15
   
  Private Type POINT
          x   As Long
          y   As Long
  End Type
   
  Private Type DROPFILES
          pFiles   As Long
          pt   As POINT
          fNC   As Long
          fWide   As Long
  End Type
   
  Private Declare Function GlobalSize 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 Function OpenClipboard Lib "user32" _
        (ByVal hwnd As Long) As Long
  Private Declare Function CloseClipboard Lib "user32" () As Long
  Private Declare Function GetClipboardData Lib "user32" _
        (ByVal wFormat As Long) As Long
   
  Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
        (Destination As Any, Source As Any, ByVal Length As Long)
       
Public mvarfilelist As String

   
  Public Function ShowFilesOnClipboard() As String
        Dim lHandle     As Long
        Dim lpResults     As Long
        Dim lRet     As Long
        Dim df     As DROPFILES
        Dim strDest     As String
        Dim lBufferSize     As Long
        Dim arBuffer()     As Byte
        Dim vNames     As Variant
        Dim i     As Long
        ShowFilesOnClipboard = ""
   
        If OpenClipboard(0) Then
              lHandle = GetClipboardData(CF_HDROP)
              '   If   you   don't   find   a   CF_HDROP,   you   don't   want   to   process   anything
              If lHandle > 0 Then
                    lpResults = GlobalLock(lHandle)
                     
                    lBufferSize = GlobalSize(lpResults)
                    ReDim arBuffer(0 To lBufferSize)
                     
                    CopyMemory df, ByVal lpResults, Len(df)
                    Call CopyMemory(arBuffer(0), ByVal lpResults + df.pFiles, _
                                                    (lBufferSize - Len(df)))
   
                    If df.fWide = 1 Then
                          '   it   is   wide   chars--unicode
                          strDest = arBuffer
                    Else
                          strDest = StrConv(arBuffer, vbUnicode)
                    End If
                    GlobalUnlock lHandle
                    vNames = Split(strDest, vbNullChar)
                    i = 0
                    While Len(vNames(i)) > 0
                          ShowFilesOnClipboard = ShowFilesOnClipboard & "<img src='file:///" & ShortPath(vNames(i)) & "'><br>"
                          i = i + 1
                    Wend
              End If
        End If
        CloseClipboard
  End Function

### 使用 Excel VBA 实现将提取的文件名复制到 为了实现将提取的文件名复制到的功能,可以通过调用 Windows API 函数 `GlobalLock` 和 `OpenClipboard` 来操作。以下是具体的方法: #### 方法概述 通过创建一个字符串变量来存储文件名,并利用 Windows API 函数将其内容放置在上。 ```vba Private Declare PtrSafe Function GlobalUnlock Lib &quot;kernel32&quot; (ByVal hMem As LongPtr) As Long Private Declare PtrSafe Function GlobalLock Lib &quot;kernel32&quot; (ByVal hMem As LongPtr) As LongPtr Private Declare PtrSafe Function GlobalAlloc Lib &quot;kernel32&quot; (ByVal wFlags As Long, ByVal dwBytes As Long) As LongPtr Private Declare PtrSafe Function CloseClipboard Lib &quot;user32&quot; () As Long Private Declare PtrSafe Function OpenClipboard Lib &quot;user32&quot; (ByVal hwnd As Long) As Long Private Declare PtrSafe Function EmptyClipboard Lib &quot;user32&quot; () As Long Private Declare PtrSafe Function lstrcpy Lib &quot;kernel32&quot; (ByVal lpwDest As Any, ByVal lpwSrc As Any) As LongPtr Private Declare PtrSafe Function SetClipboardData Lib &quot;user32&quot; (ByVal wFormat As Long, ByVal hMem As LongPtr) As LongPtr Sub CopyFileNameToClipboard(fileName As String) Dim hGlobalMemory As LongPtr Dim lpGlobalMemory As LongPtr Dim PCopy As Integer &#39; 打开并清空旧数据 If OpenClipboard(0&amp;) = 0 Then Exit Sub Call EmptyClipboard() &#39; 分配全局内存块用于保存新数据 hGlobalMemory = GlobalAlloc(&amp;H40&amp;, Len(fileName) + 1&amp;) lpGlobalMemory = GlobalLock(hGlobalMemory) &#39; 复制文件名到分配好的内存空间中 Call lstrcpy(lpGlobalMemory, fileName) Call GlobalUnlock(hGlobalMemory) &#39; 设置新的内容为上述内存地址的数据 PCopy = SetClipboardData(1&amp;, hGlobalMemory) Call CloseClipboard() End Sub ``` 此代码片段展示了如何声明必要的API函数以及编写子程序 `CopyFileNameToClipboard` 来完成这一功能[^1]。 当需要实际应用时,只需调用这个过程并将目标文件名称作为参数传递给它即可。例如,在某个按钮点击事件或其他触发条件下执行如下命令: ```vba Call CopyFileNameToClipboard(&quot;C:\example.txt&quot;) ``` 这会把路径 `&quot;C:\example.txt&quot;` 放入系统的里等待进一步处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值