В Google Chrome есть удобная функция, где я могу щелкнуть ссылку для загрузки и перетащить ее в окно проводника Windows, а затем отбросить. После удаления Chrome затем загружает файл, и он появляется там, где я его удалял.
Я хотел бы иметь возможность отказаться от Google Chrome в моем приложении, но, похоже, это не так просто. У меня есть DataGridView, называемый gridFiles, и следующий код:
Private Sub gridFiles_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles gridFiles.DragDrop
If e.Data.GetDataPresent(DataFormats.FileDrop) Then
Dim DroppedFiles() As String = e.Data.GetData(DataFormats.FileDrop)
If Not DroppedFiles Is Nothing Then
For Each file As String In DroppedFiles
MsgBox(file)
Next
End If
End If
End Sub
Private Sub gridFiles_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles gridFiles.DragEnter
If e.Data.GetDataPresent(DataFormats.FileDrop) Then
e.Effect = DragDropEffects.All
End If
End Sub
Когда я отбрасываю файлы на него из Проводника Windows, все работает нормально, и я получаю окно сообщения для каждого удаляемого файла. Однако, когда я перехожу из Chrome, ничего не происходит. Причиной этого является то, что DroppedFiles
равно Nothing
. Кажется, что e.Data.GetData
ничего не возвращает. Я проверил форматы с помощью e.Data.GetFormats()
и возвращает FileDrop
, FileName
, FileNameW
, как и ожидалось, при любом удалении файла.
Я уверен, что в Chrome говорится, что у него есть некоторые файлы, поэтому функции DragEnter
, но поскольку он еще не загрузил файл, DragDrop
не может быть выполнен, поэтому Chrome не возвращает файлы. Я подозреваю, что в контексте Windows Explorer Chrome каким-то образом получает этот путь к окну и копирует его сам позже.
Итак, мой вопрос...
Как я могу одурачить Google Chrome в моем приложении? Я вижу, что это работает, как-то предоставляя Chrome временную папку, в которой она думает, что она сбросила файл, и мое приложение будет отслеживать эту папку для новых файлов и вытаскивать их, как только они будут загружены. Мне просто нужно найти способ, чтобы Chrome "знал" эту папку.
В качестве альтернативы, если бы я мог получить URL-адрес того, что было отброшено, это было бы прекрасно. Затем я мог загрузить файл с помощью моей программы.
Очень приветствуются любые советы. Спасибо.
EDIT:. Кажется, что с регулярными URL-адресами я получаю правильный формат UniformResourceLocator. Поведение, которое я вижу, происходит с ссылками на скачивание в Gmail. Вероятно, это происходит в другом месте, но я не уверен. Когда вложение gmail перетаскивается из Gmail в мое приложение, я получаю FileDrop.
Выполняя еще одно копание, похоже, что Gmail использует атрибут download_url
тега привязки. Я никогда не слышал об этом раньше. Возможно, это просто дополнительная собственность, которую они добавили?
В любом случае, поскольку мое приложение будет в основном использоваться с вложениями электронной почты, мне нужно, чтобы файл phantom FileDrop работал, как указано выше. Я не могу использовать Spy ++. Кажется, что он не показывает сообщений, когда происходят капли. (Я приветствую любые советы по этой проблеме.)
Изменить # 2: Подробнее о том, как Gmail использует перетаскивание файлов: http://www.thecssninja.com/javascript/gmail-dragout