Подтвердить что ты не робот

Реализация перетаскивания из Chrome в моей Windows-форме 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, все работает нормально, и я получаю окно сообщения для каждого удаляемого файла. Однако, когда я перехожу из 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

4b9b3361

Ответ 1

Я сам вытащил несколько килограммов волос из-за странного поведения перетаскивания. Spy ++, как упомянуто шестью переменными, может быть хорошей идеей. Другим было бы взглянуть на обсуждение одного из моих вопросов Q/As здесь в SO:

Перетаскивание между экземплярами одного и того же приложения Windows Forms

По моему собственному опыту, я, похоже, помню, что перетаскивание из браузера является проблемой безопасности и, таким образом, обрабатывается по-разному. Надеюсь, это поможет.

EDIT:

Возможно, это отвечает на ваш вопрос:

http://www.vbforums.com/showthread.php?t=529211

Ответ 2

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

Ответ 3

Странно, я получаю только ярлыки при перетаскивании файлов из Chrome.

В любом случае, если Chrome делает перетаскивание с виртуальными источниками, то есть он загружает файл и генерирует контент при завершении перетаскивания, вам нужно реализовать интерфейс оболочки IDropTarget. Я чувствую, что содержимое файла может быть передано через IStream, который не поддерживается .NET Drag & Drop.

Возможно, это http://msdn.microsoft.com/en-us/library/bb776904%28VS.85%29.aspx#copying и этот перетащить виртуальные файлы с помощью IStream должен получить вас на правильном пути.