net dotnetbrowser control .net vb.net google-chrome drag-and-drop ole

dotnetbrowser - Implementando arrastrar y soltar desde Chrome en mi formulario.NET Windows



chromium.net control (3)

Google Chrome tiene una práctica función donde puedo hacer clic en un enlace de descarga y arrastrarlo a la ventana del Explorador de Windows, y luego soltarlo. Después de dejar caer, Chrome descarga el archivo y aparece donde lo dejé.

Me gustaría poder pasar de Google Chrome a mi aplicación, pero parece que no es tan simple. Tengo un DataGridView llamado gridFiles, y el siguiente código:

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

Cuando coloco archivos en él desde el Explorador de Windows, todo funciona bien y aparece un cuadro de mensaje para cada archivo que se eliminó. Sin embargo, cuando salgo de Chrome, no pasa nada. La razón de esto es que DroppedFiles es igual a Nothing . Parece que e.Data.GetData no devuelve nada. He comprobado los formatos con e.Data.GetFormats() y devuelve FileDrop , FileName , FileNameW como se esperaba con cualquier archivo desplegable.

Lo que estoy seguro de que está sucediendo es que Chrome dice que tiene algunos archivos para que funcione DragEnter , pero como aún no ha descargado el archivo, DragDrop no se puede hacer, por lo que Chrome no devuelve ningún archivo. Sospecho que en el contexto de Windows Explorer, Chrome de alguna manera obtiene la ruta de esa ventana y copia el archivo allí más tarde.

Entonces mi pregunta es ...

¿Cómo puedo engañar a Google Chrome para que ingrese en mi aplicación? Veo que esto funciona al darle a Chrome una carpeta temporal donde cree que se ha caído el archivo, y mi aplicación monitorea esa carpeta en busca de nuevos archivos y los extrae una vez que se descargan. Solo necesito encontrar una forma de que Chrome "conozca" esa carpeta.

Alternativamente, si pudiera obtener la URL de lo que se eliminó, también estaría bien. Entonces podría descargar el archivo con mi programa.

Todos y cada uno de los consejos son muy apreciados. Gracias.

EDITAR: Parece que con las URL regulares obtengo el formato UniformResourceLocator arrastrado. El comportamiento que estoy viendo ocurre con los enlaces de descarga en Gmail. Probablemente suceda en otro lado, pero no estoy seguro. Cuando un archivo adjunto de Gmail se arrastra desde Gmail a mi aplicación, obtengo un FileDrop.

Haciendo un poco más de excavación, parece que Gmail está utilizando el atributo download_url de la etiqueta de anclaje. Nunca he oído hablar de esto antes. Tal vez esto es solo una propiedad extra que han agregado?

En cualquier caso, dado que mi aplicación se utilizará principalmente con archivos adjuntos de correo electrónico, necesito una forma para que funcione el Filedrop fantasma, como se indicó anteriormente. No puedo usar Spy ++. No parece mostrar ningún mensaje cuando se producen caídas. (También doy la bienvenida a cualquier consejo sobre ese problema).

Editar # 2: Aquí hay más información sobre cómo Gmail utiliza arrastrar / soltar para los archivos: http://www.thecssninja.com/javascript/gmail-dragout


¿Ha considerado usar el Spy ++ para ver qué mensajes se envían desde Chrome al Explorador de Windows? Spy ++ tiene un registro de mensajes que me ha ayudado en el pasado con un comportamiento extraño. Puede habilitar el registro de WM_DROPFILES, etc.


Extrañamente, solo obtengo accesos directos cuando arrastro archivos desde Chrome.

De todos modos, en caso de que Chrome arrastre y suelte con fuentes virtuales, es decir, descargue el archivo y genere el contenido en la función de arrastrar y soltar, debe implementar la interfaz del shell IDropTarget. Me da la sensación de que el contenido del archivo puede transferirse a través de IStream, que no es compatible con .NET Drag & Drop.

Tal vez este http://msdn.microsoft.com/en-us/library/bb776904%28VS.85%29.aspx#copying y esto Arrastrar y soltar archivos virtuales con IStream debe llevarlo por el camino correcto.


Me he quitado kilómetros de pelo de mi cabeza teniendo en cuenta el extraño comportamiento de arrastrar y soltar. Spy ++ como se menciona en sixlettervariables podría ser una buena idea. Otra sería echar un vistazo a la discusión de una de mis preguntas y respuestas aquí en SO:

Arrastrar y colocar entre instancias de la misma aplicación de Windows Forms

Desde mi propia experiencia, parece recordar que arrastrar / soltar desde un navegador es un problema de seguridad y, por lo tanto, se maneja de manera diferente. Espero que esto ayude.

EDITAR:

Quizás esto responde tu pregunta:

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