Как скопировать файл в буфер обмена и вставить его в другое место?

У меня есть список с маленькими эскизами изображений. Каждое изображение имеет тег, в котором есть полный путь.

С помощью меню rightclick пользователь может нажать кнопку COPY.

Затем этот код исключается:

Dim selectedfile As String

selectedfile = Me.lvFotos.SelectedItems(0).Tag


Dim dataobj As New DataObject(DataFormats.FileDrop, selectedfile)

Clipboard.Clear()
Clipboard.SetDataObject(dataobj)

Теперь, когда я нажимаю на свой рабочий стол, чтобы вставить файл, я получаю ошибку исключения в VS2010:

Исключение типа "System.Runtime.InteropServices.COMException" произошло в System.Windows.Forms.dll и не обрабатывалось до управляемой/нативной границы

Дополнительная информация: Недопустимая структура FORMATETC (Исключение из HRESULT: 0x80040064 (DV_E_FORMATETC))

Что я здесь делаю неправильно?

гк. Эрик

3 ответа

Использование кода от Джона Смита при копировании файла в буфер обмена:

Dim f() As String = {"C:\temp\Folder.jpg"}
Dim d As New DataObject(DataFormats.FileDrop, f)
Clipboard.SetDataObject(d, True)

(Протестировано как работающее в VS2013 на Windows 7 x64.)

Обратите внимание, что вам нужно передать массив строк, представляющих ваши имена файлов, чтобы вы могли позволить пользователю собрать несколько элементов перед вставкой, если хотите.

true в Clipboard.SetDataObject позволяет сохранять данные в буфере обмена при выходе из программы, поэтому, если пользователь должен выбрать файл и выйти до вставки, они не потеряли бы свой выбор.


Вы можете напрямую использовать My.Computer.FileSystem.CopyFile.

Dim source As String = lvFotos.SelectedItems(0).Tag
Dim destination As String = My.Computer.FileSystem.SpecialDirectories.Desktop & from.Substring(from.LastIndexOf("\"))
My.Computer.FileSystem.CopyFile(source, destination)


Нашел то, что я делал неправильно.

Сначала я попробовал его с именем файла в массиве, но это дало ту же ошибку.

Теперь у меня это так:

Dim selectedfile(0) As String

selectedfile(0) = Me.lvFotos.SelectedItems(0).Tag

Dim dataobj As New DataObject

dataobj.SetData(DataFormats.FileDrop, True, selectedfile)

Clipboard.Clear()
Clipboard.SetDataObject(dataobj, True)

Разница находится в строке с SETDATA. Установив второй аргумент TRUE в SetData, а также в SetDataObject, он начал работать.

licensed under cc by-sa 3.0 with attribution.