.net - 在.NET Windows窗体上从Chrome实现拖放

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

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()检查了格式,并按预期在任何文件删除的情况下返回了FileDropFileNameFileNameW

我完全可以肯定的是,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/

相关文章:

.net - System.Data.Entity.ModelConfiguration.Mappers.TypeMapper 在哪个程序集中定义?

c# - 如何使用 Lucene.Net 查询集合中的术语,类似于 SQL 的 IN 运算符?

vb.net - 如何在 vb .net 中获取任何已连接打印机的型号

c# - .NET 隐藏标题栏但保留边框

java - 如何使用 chrome、firefox 或任何浏览器的所有相同公钥/证书创建 SSLEngine?

c# - 用于 3D 球体绘图的最佳 .NET 图形库?

.net - 是否有用于像 Processing 或 OpenFrameworks 这样的艺术编码的 .Net 库?

.net - 在 VB.net 中以表格形式显示 PDF

twitter-bootstrap - 底部滚动故障上的 Bootstrap Affix(Chrome 和 Firefox)

css - Chrome CSS 绝对位置故障