65.9K
CodeProject 正在变化。 阅读更多。
Home

在 VB.NET 中获取剪贴板文件拖放效果

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.13/5 (10投票s)

2009年1月19日

CPOL

1分钟阅读

viewsIcon

43842

downloadIcon

537

如何在 VB.NET 中访问文件的拖放效果,以便区分文件拖放列表的剪切和粘贴操作。

引言

在 VB6 中,你可以使用各种 API 调用来获取剪贴板上的文件 FileDropList,以及其他一些调用来获取 DropEffect,从而判断文件是从 Windows 文件资源管理器中复制还是剪切的。

在 VB.NET 中,使用专门的字符串集合从剪贴板获取 FileDropList 更加容易。但我找不到获取 DropEffect 的方法。通过查看旧方法的工作原理,并参考我找到的一个 C# 示例,我得以获取 DropEffect

要获取 DropEffect,请将一个 Object 设置为 My.Computer.Clipboard.GetData("Preferred DropEffect"),然后将前 4 个字节读入字节数组。第一个字节是 DropEffect。我没有使用其他 3 个字节,但旧代码由于变量格式的原因会获取它们,所以我也是如此。

在 VB6 中获取 FileDropList 和 DropEffect

在 VB6 中,你可以使用剪贴板函数的调用来检索文件列表,然后使用另一个调用来获取带有拖放效果的数据。调用 MoveMemory 将数据放入我们可以使用的格式中。(关于如何在 VB6 中执行此操作的完整示例可以在其他地方找到)。

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 RegisterClipboardFormat Lib "user32" +
        Alias "RegisterClipboardFormatA" (ByVal lpString As String) As Long

Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" _
       (ByRef Destination As Any, ByRef Source As Any, ByVal Length 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 lngEffect     As Long
   Dim lngFormat     As Long
   Dim hGlobal       As Long
   Const MAX_PATH    As Long = 260
   
   ' Insure desired format is there, and open clipboard.
   If IsClipboardFormatAvailable(CF_HDROP) Then
      If OpenClipboard(0&) Then
         
         ' Get handle to Dropped Filelist data, and number of files.
         hDrop = GetClipboardData(CF_HDROP)
         nFiles = DragQueryFile(hDrop, -1&, "", 0)
         
         ' Allocate space for return and working variables.
         ReDim Files(0 To nFiles - 1) As String
         Filename = Space(MAX_PATH)
         
         ' Retrieve each filename in Dropped Filelist.
         For i = 0 To nFiles - 1
            Call DragQueryFile(hDrop, i, Filename, Len(Filename))
            Files(i) = TrimNull(Filename)
         Next
         
         lngFormat = RegisterClipboardFormat(CFSTR_PREFERREDDROPEFFECT)
         hGlobal = GetClipboardData(lngFormat)
      
         If (hGlobal) Then
           MoveMemory lngEffect, ByVal hGlobal, 4
           DropEffect = lngEffect
         End If

      End If
End If

在 VB.NET 中获取 FileDropList 和 DropEffect

在 VB.NET 中获取 DropEffect 需要从剪贴板获取“Preferred DropEffect”数据,并使用内存流读取它。

'*>-------------------------------------------------------------------
'*>Handle Droplist
'*>-------------------------------------------------------------------
If My.Computer.Clipboard.ContainsFileDropList() Then

    '*>-------------------------------------------------------------------
    '*>Get DropEffect Type
    '*>-------------------------------------------------------------------
    Dim DropEffectData(3) As Byte
    Dim DropEffectCheck As Object = _
        My.Computer.Clipboard.GetData("Preferred DropEffect")
    DropEffectCheck.Read(DropEffectData, 0, DropEffectData.Length)

    Select Case DropEffectData(0)
        Case 2
            DropEff = DragDropEffects.Move
            DropEffType = "Move"
        Case 5
            DropEff = DragDropEffects.Copy
            DropEffType = "Copy"
        Case Else
            DropEffType = "???"
    End Select

    DropEffNum = DropEffectData(0).ToString
    TextBox1.Text = String.Concat(DropEffNum, " - ", DropEffType)

    '*>-------------------------------------------------------------------
    '*>Get File Names
    '*>-------------------------------------------------------------------
    Dim FileNameCollection As Collections.Specialized.StringCollection = _
                              My.Computer.Clipboard.GetFileDropList()
    For Each FileName As String In FileNameCollection
        RichTextBox1.Text = String.Concat(RichTextBox1.Text, FileName, vbCrLf)
    Next

End If

示例应用程序

示例应用程序显示了 DropEffect 以及你放在剪贴板上的文件列表。在文件资源管理器中切换剪切和复制文件,以查看 DropEffect 的变化。

© . All rights reserved.