Реализация перетаскивания из Chrome в моей форме .NET Windows - PullRequest
17 голосов
/ 25 мая 2011

В 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, как и ожидалось при любом удалении файла.

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

Поэтому мой вопрос ...

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

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

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


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

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

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

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

Ответы [ 3 ]

3 голосов
/ 28 мая 2011

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

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

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

EDIT:

Может быть, это отвечает на ваш вопрос:

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

2 голосов
/ 01 июня 2011

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

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

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

2 голосов
/ 27 мая 2011

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

...