Реализация перетаскивания из Chrome в моей форме .NET Windows

В 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 Explorer, все работает нормально, и я получаю окно сообщения для каждого удаленного файла. Однако, когда я выхожу из Chrome, ничего не происходит. Причина в том, что DroppedFiles равно Nothing . Похоже, что e.Data.GetData ничего не возвращает. Я проверил форматы с помощью e.Data.GetFormats () , и он возвращает FileDrop , FileName , FileNameW , как и ожидалось, с любым файлом. drop.

Я совершенно уверен, что происходит то, что Chrome сообщает, что у него есть файлы, поэтому DragEnter работает, но, поскольку он еще не загрузил файл, DragDrop невозможно, поэтому Chrome не возвращает файлы. Я подозреваю, что в контексте проводника Windows Chrome каким-то образом получает путь к этому окну и позже копирует туда сам файл.

Так что мой вопрос ...

Как я могу заставить Google Chrome загрузиться в мое приложение? Я вижу, что это работает, каким-то образом предоставляя Chrome временную папку, в которую, по его мнению, он удалил файл, и мое приложение будет отслеживать эту папку на предмет новых файлов и извлекать их после их загрузки. Мне просто нужно найти способ, чтобы Chrome «знал» эту папку.

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

Любые советы очень приветствуются. Спасибо.


РЕДАКТИРОВАТЬ: Таким образом, кажется, что с обычными URL-адресами я получаю правильный перетаскиваемый формат UniformResourceLocator. Я наблюдаю такое поведение со ссылками для загрузки в Gmail. Вероятно, это происходит где-то еще, но я не уверен. Когда вложение Gmail перетаскивается из Gmail в мое приложение, Я получаю FileDrop.

Еще немного покопавшись, кажется, что Gmail использует атрибут download_url тега привязки. Я никогда не слышал об этом раньше. Может быть, это просто дополнительное свойство, которое они добавили?

В любом случае, поскольку мое приложение в основном будет использоваться с вложениями электронной почты, мне нужен способ работы фантомного FileDrop, как указано выше. Я не могу использовать Spy ++. Кажется, что при падении не отображается никаких сообщений. (Я также приветствую любые советы по этой проблеме.)

Редактировать № 2: Дополнительная информация о том, как Gmail использует перетаскивание файлов: http://www.thecssninja.com/javascript / gmail-dragout

17
задан Brad 31 May 2011 в 15:29
поделиться

1 ответ

Рассматривали ли вы использование Spy ++ , чтобы увидеть, какие сообщения отправляются из Chrome в Windows Explorer? Spy ++ имеет ведение журнала сообщений, которое помогло мне в прошлом странным поведением. Вы можете включить ведение журнала WM_DROPFILES и т. Д.

2
ответ дан 30 November 2019 в 14:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: