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会以某种方式获取该窗口的路径并在以后将文件复制到那里。所以我的问题是
如何欺骗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
最佳答案
关于怪异的拖拽行为,我自己已经把头上的几千米的头发拔掉了。六字母变量提到的Spy ++可能是一个好主意。另一个将是我在SO的一个Q / As中的讨论:
Drag and Drop between Instances of the same Windows Forms Application
根据我自己的经验,我似乎记得从浏览器进行拖放是一个安全问题,因此处理方式有所不同。希望这可以帮助。
编辑:
也许这可以回答您的问题:
http://www.vbforums.com/showthread.php?t=529211
关于.net - 在.NET Windows窗体上从Chrome实现拖放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6125921/