在我的.NET Windows窗体上实现Chrome的拖放操作

时间:2011-05-25 14:20:06

标签: .net vb.net google-chrome drag-and-drop ole

谷歌浏览器有一个方便的功能,我可以点击下载链接并将其拖到Windows资源管理器窗口,然后删除。删除后,Chrome会下载该文件,然后它会显示在我删除的位置。

我希望能够从谷歌浏览器中删除我的应用程序,但似乎并非如此简单。我有一个名为gridFiles的DataGridView,以及以下代码:

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()检查了格式,并按预期的方式返回FileDropFileNameFileNameW以及任何文件丢弃。

我确信发生的事情是Chrome说它有一些文件以便DragEnter功能,但由于尚未下载文件,DragDrop无法完成,因此Chrome不返回任何文件。我怀疑在Windows资源管理器上下文中,Chrome会以某种方式获取该窗口的路径并在稍后将文件复制到其中。

所以我的问题是......

如何欺骗谷歌浏览器进入我的应用程序?我看到这个工作以某种方式给Chrome一个临时文件夹,它认为它已经删除了文件,我的应用程序将监视该文件夹中的新文件并在下载后将其拉入。我只需找到一种方法让Chrome“知道”该文件夹。

或者,如果我可以获得丢弃内容的URL,那也可以。然后我可以用我的程序下载文件。

非常感谢任何和所有建议。感谢。


编辑:因此,对于常规网址,我确实获得了正确的拖入UniformResourceLocator格式。我看到的行为与Gmail中的下载链接有关。它可能发生在其他地方,但我不确定。当gmail附件从Gmail拖到我的应用程序中时,我会得到一个FileDrop。

进行更多挖掘,似乎Gmail正在使用锚标记的download_url属性。我以前从未听说过这个。也许这只是他们添加的额外财产?

在任何情况下,由于我的应用程序主要用于电子邮件附件,我需要一种方法让幻像FileDrop工作,如上所述。我无法使用Spy ++。当发生丢弃时,它似乎没有显示任何消息。 (我也欢迎任何关于这个问题的建议。)

编辑#2:以下是有关Gmail如何利用文件拖放功能的更多信息:http://www.thecssninja.com/javascript/gmail-dragout

3 个答案:

答案 0 :(得分:3)

对于奇怪的拖拽行为,我自己从头上拉了几公里的头发。六个变量提到的间谍++可能是一个好主意。另一个是在SO:

看一下我的Q / As中的一个讨论

Drag and Drop between Instances of the same Windows Forms Application

根据我自己的经验,我似乎记得从浏览器拖放是一个安全问题,因此处理方式不同。希望这会有所帮助。

修改

也许这回答了你的问题:

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

答案 1 :(得分:2)

您是否考虑过使用 Spy ++ 查看从Chrome发送到Windows资源管理器的邮件?间谍++有消息记录,这在过去帮助我做了奇怪的行为。您可以启用WM_DROPFILES等的日志记录。

答案 2 :(得分:2)

奇怪的是,从Chrome浏览文件时我只能获得快捷方式。

无论如何,如果Chrome做了阻力&删除虚拟源,也就是说,它下载文件并在拖放时生成内容。 drop completion,你必须实现shell接口IDropTarget。我感觉文件内容可能通过IStream传输,而.NET Drag& Drop不支持。

也许这个http://msdn.microsoft.com/en-us/library/bb776904%28VS.85%29.aspx#copyingDrag and drop virtual files using IStream应该让你走上正确的道路。