Fozzie
Feb 16th, 2001, 05:43 PM
Hi all
I've written some code for files selected in explorer to be dragged and dropped in to my application (Not Rocket Science).
Q. How do I access the files if they have been copied by explorer (Edit Menu - Copy) ie Paste them in to my application. They aren't present on the clipboard.
Do you know the answer or have you had a similar problem. Any pointers greatly appreciated
FOUND THE ANSWER
http://support.microsoft.com/support/kb/articles/Q231/7/21.ASP
Option Explicit
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)
Private Sub ShowFilesOnClipboard()
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
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
List1.AddItem vNames(i)
i = i + 1
Wend
End If
End If
CloseClipboard
End Sub
Private Sub Command1_Click()
Call ShowFilesOnClipboard
End Sub
I've written some code for files selected in explorer to be dragged and dropped in to my application (Not Rocket Science).
Q. How do I access the files if they have been copied by explorer (Edit Menu - Copy) ie Paste them in to my application. They aren't present on the clipboard.
Do you know the answer or have you had a similar problem. Any pointers greatly appreciated
FOUND THE ANSWER
http://support.microsoft.com/support/kb/articles/Q231/7/21.ASP
Option Explicit
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)
Private Sub ShowFilesOnClipboard()
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
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
List1.AddItem vNames(i)
i = i + 1
Wend
End If
End If
CloseClipboard
End Sub
Private Sub Command1_Click()
Call ShowFilesOnClipboard
End Sub