Visual Basic.NET 7.x (2002/03)Visual Basic 9 (2008)Visual Basic 8 (2005)Visual Basic 6中级开发.NETVisual Basic
在 VB.NET 中获取剪贴板文件拖放效果






4.13/5 (10投票s)
如何在 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
的变化。