【发布时间】:2011-09-01 19:50:05
【问题描述】:
Google Chrome 有一个方便的功能,我可以单击下载链接并将其拖到 Windows 资源管理器窗口中,然后放下。删除后,Chrome 会下载文件并显示在我删除它的位置。
我希望能够从 Google 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()检查了格式,它返回FileDrop、FileName、FileNameW,正如预期的任何文件丢弃。
我很确定正在发生的是 Chrome 说它有一些文件以便 DragEnter 起作用,但由于它尚未下载文件,DragDrop 无法完成,因此 Chrome 不返回任何文件。我怀疑在 Windows 资源管理器上下文中,Chrome 会以某种方式获取该窗口的路径并稍后将文件复制到那里。
所以我的问题是......
如何欺骗 Chrome 浏览器进入我的应用程序?我通过以某种方式为 Chrome 提供一个它认为已删除文件的临时文件夹来实现这一点,并且我的应用程序将监视该文件夹中的新文件并在下载后将它们拉入。我只需要找到一种方法让 Chrome “知道”那个文件夹。
或者,如果我能获得所删除内容的 URL,那也很好。然后我可以用我的程序下载文件。
非常感谢任何和所有建议。谢谢。
编辑: 所以看来,使用常规 URL,我确实得到了正确的拖入 UniformResourceLocator 格式。我看到的行为发生在 Gmail 中的下载链接上。它可能发生在其他地方,但我不确定。当一个 gmail 附件从 Gmail 拖到我的应用程序中时,我得到一个 FileDrop。
做一些更多的挖掘,似乎Gmail正在使用锚标记的download_url属性。我以前从未听说过。也许这只是他们添加的额外属性?
在任何情况下,由于我的应用程序主要用于电子邮件附件,因此我需要一种方法让幻像 FileDrop 工作,如上所述。我无法使用 Spy++。发生掉落时,它似乎没有显示任何消息。 (我也欢迎任何关于这个问题的建议。)
编辑 #2: 以下是有关 Gmail 如何利用拖放操作文件的更多信息:http://www.thecssninja.com/javascript/gmail-dragout
【问题讨论】:
-
如果我能得到 URL... 仅限于 pemalink url
-
@Luis,你是什么意思?
-
在某些下载(不是永久链接 url)上,您的应用将没有必要的会话状态(cookie)来访问所需的文件。
-
您可能想要检查
e.Data.GetFormats()返回的值,而不是依赖DataFormats.FileDrop。做一些快速测试,它看起来像"UniformResourceLocator"(甚至"Text")格式使e.Data.Get(...)返回一个MemoryStream,其中包含指向纯文本拖动链接的URL。也许这是需要进一步调查的事情。 -
@WraithNath 你可以看看 Chromium 源代码。这可能会提供更多答案。
标签: .net vb.net google-chrome drag-and-drop ole