Dateien aus der Ablage
Kopierte Dateien aus der Zwischenablage ermitteln
Das VB Clipboard-Objekt beschränkt sich bei seinen Funktionen auf Grafik- und Textdaten. Für Dateien, die im Explorer kopiert/ausgeschnitten wurden, bietet es keine Funktionen an. Dieser Artikel zeigt Ihnen, wie Sie dieses Defizit ausgleichen können ...
Anders als das DataObject-Objekt, das bei OLE Drag & Drop Vorgängen zum Zuge kommt, lässt das Clipboard-Objekt eine Möglichkeit vermissen im Explorer kopierte Dateien der Zwischenablage zu entlocken.
Um an die Dateinamen zu kommen, die bei einem Kopiervorgang in der Zwischenablage abgelegt wurden, muss man direkt auf die Zwischenablage zugreifen. Dies erfolgt über die API Funktionen OpenClipboard, zum Öffnen der Zwischenablage und GetClipboardData. Letztere liefert den Handle einer DROPFILES-Struktur (HDROP), die die kopierten Dateinamen enthält. Diese werden mit der API Funktion DragQueryFile extrahiert.
Übergibt man der DragQueryFile Funktion nur den HDROP Handle und –1 als Index, liefert sie die Anzahl der enthaltenen Dateien. Übergibt man hingegen als Index einen Wert zwischen 0 und der Anzahl der insgesamt enthaltenen Dateien, erhält man die Länge des Dateinamens, die dazu genutzt wird einen passenden Puffer zu reservieren. In diesen kann dann der extrahierte Dateiname geschrieben werden.
Zur Erkennung, ob die Quelldateien vom Benutzer ausgeschnitten oder kopiert wurden, muss man den sogenannten "DropEffect" abfragen, der unter dem Format "Preferred DropEffect" in der Zwischenablage abgelegt sind. Da dies ein benutzerdefiniertes Format ist, muss die passende ID zunächst über die API Funktion RegisterClipboardFormat ermittelt werden und wird genutzt, um mit der Funktion GetClipboardData den Handle zu erhalten, der auf den Long-Wert mit dem DropEffect verweist. Dieser wird mit der API Funktion MoveMemory in eine lokale Variable kopiert. Die möglichen Werte sind in der FileDropEffectConstants- Aufzählung deklariert.
Die ClipboardGetFiles Funktion erledigt alles notwendige und gibt eine handliche Collection mit den Pfad- und Dateinamen des Clipboards zurück, die Sie in Ihrer Anwendung weiter verwenden können. Über den Parameter DropEffect, können Sie abfragen, ob die Dateien kopiert oder ausgeschnitten wurden:
Private Declare Function RegisterClipboardFormat Lib "user32" Alias _ "RegisterClipboardFormatA" (ByVal lpString As String) As Long Private Declare Function IsClipboardFormatAvailable Lib "user32" _ (ByVal wFormat As Long) As Long Private Declare Function OpenClipboard Lib "user32" _ (ByVal hwnd As Long) As Long Private Declare Function GetClipboardData Lib "user32" _ (ByVal wFormat As Long) As Long Private Declare Function CloseClipboard Lib "user32" () As Long Private Declare Function DragQueryFile Lib "shell32.dll" Alias _ "DragQueryFileA" (ByVal hDrop As Long, _ ByVal iFile As Long, ByVal lpszFile As String, _ ByVal cch As Long) As Long Private Declare Sub MoveMemory Lib "kernel32" Alias _ "RtlMoveMemory" (ByRef Destination As Any, _ ByRef Source As Any, ByVal Length As Long) Private Const CF_HDROP As Long = 15 Private Const CFSTR_PREFERREDDROPEFFECT As String = "Preferred DropEffect" Public Enum FileDropEffectConstants fdDropEffectNone = 0 fdDropEffectCopy = 1 fdDropEffectMove = 2 fdDropEffectLink = 4 End Enum Public Function ClipboardGetFiles( _ Optional ByRef DropEffect As FileDropEffectConstants _ ) As Collection Dim lngSize As Long Dim strFile As String Dim hDrop As Long Dim lngFormat as Long Dim hGlobal As Long Dim lngEffect As Long Dim l As Long If (IsClipboardFormatAvailable(CF_HDROP) = 0) Then Exit Function If (OpenClipboard(0)) Then hDrop = GetClipboardData(CF_HDROP) If (hDrop) Then Set ClipboardGetFiles = New Collection With ClipboardGetFiles For l = 0 To DragQueryFile(hDrop, -1, vbNullString, 0) - 1 lngSize = DragQueryFile(hDrop, l, vbNullString, 0) strFile = String$(lngSize + 1, 0) lngSize = DragQueryFile(hDrop, l, strFile, Len(strFile)) .Add Left$(strFile, lngSize) Next End With lngFormat = RegisterClipboardFormat(CFSTR_PREFERREDDROPEFFECT)) hGlobal = GetClipboardData(lngFormat) If (hGlobal) Then MoveMemory lngEffect, ByVal hGlobal, 4 DropEffect = lngEffect End If End If CloseClipboard End If End Function
Updates
- [16.03.2002]
- - Erkennung, ob die Dateien kopiert oder ausgeschnitten wurden.
Download
- Modul modGetClipboardFiles und Beispielprojekt (getclipboardfiles.zip - 4 KB)