Перетаскивание из формы в Windows; получить пункт назначения - PullRequest
3 голосов
/ 14 февраля 2010

Я разрабатывал приложение в VB.NET, для которого требуется, чтобы объект управления (например, ListViewItem) перетаскивался из формы в указанное пользователем место (например, на рабочем столе или в папку).

Однако, файл, который предназначен для «копирования», как представляет «ListViewItem», еще не существует. Его необходимо загрузить, а затем поместить в указанное пользователем местоположение. Могу ли я узнать путь / местоположение пункта назначения? Затем я перехожу к загрузке файла и помещаю его туда, где указано использование.

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

По сути, я думаю, что для этого может потребоваться какая-то «динамическая ссылка» или «виртуальный файл», как я уже упоминал ранее. Затем, после операции удаления, каким-либо образом получая доступ к этой «ссылке» из моего приложения, перейдите к загрузке файла и поместите его в конечный пункт назначения удаления.

Любая помощь приветствуется, спасибо заранее!


РЕЗУЛЬТАТ:

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

Ответы [ 3 ]

5 голосов
/ 02 марта 2010

Вы можете попросить Проводника отложить вызов IDataObject :: GetData для CFSTR_FILEDESCRIPTOR до момента, когда фактически произойдет удаление, ответив CFSTR_PREFERREDDROPEFFECT в вашей реализации IDataObject :: GetData.См. http://hg.mozilla.org/mozilla-central/file/b49a6a8a4973/widget/src/windows/nsDataObj.cpp для примера.Обратите внимание, что если целью является виртуальная папка, цель удаления не обязана учитывать ваши предпочтения.

Проводник проверяет форматы буфера обмена для имени файла в следующем порядке:

  1. CF_HDROP

  2. CFSTR_FILEDESCRIPTOR / CFSTR_FILECONTENTS

  3. CFSTR_FILENAME

Не используйте CF_HDROP, поскольку для этого требуется, чтобы источникфайл (ы) фактически существует где-то в файловой системе.Вместо этого используйте CFSTR_FILEDESCRIPTOR / CFSTR_FILECONTENTS.

2 голосов
/ 05 марта 2010

Вы действительно хотите знать, где "файл" был сброшен? Или вы просто не хотите предоставлять данные заранее?

Если последнее, у Раймонда Чена есть целая серия по реализации виртуального перетаскивания в собственном коде. Дэвид Ансон переводит его в управляемый код , а добавляет асинхронную поддержку .

2 голосов
/ 01 марта 2010

Извините, но нет способа получить целевой путь операции DnD. Потому что цель сброса может даже не иметь пути!

См. здесь для более подробного объяснения.

Конечно, вы можете попытаться подключиться к DnD, затем запросить целевое окно и оттуда попытаться найти целевой путь, если окно известно вам (например, окно принадлежит процессу проводника).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...