2008-11-11 18 views
8

Tengo un problema al arrastrar un archivo desde el Explorador de Windows a una aplicación de Windows Forms.Arrastrar y soltar desde Windows File Explorer a Windows Form no funciona

Funciona bien cuando arrastro texto, pero por alguna razón no reconoce el archivo. Aquí está mi código de prueba:

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_DragDrop(object sender, DragEventArgs e) 
     { 

     } 

     private void Form1_DragEnter(object sender, DragEventArgs e) 
     { 
      if (e.Data.GetDataPresent(DataFormats.Text)) 
      { 
       e.Effect = DragDropEffects.Copy; 
      } 
      else if (e.Data.GetDataPresent(DataFormats.FileDrop)) 
      { 
       e.Effect = DragDropEffects.Copy; 
      } 
      else 
      { 
       e.Effect = DragDropEffects.None; 
      } 
     } 
    } 
} 

AllowDrop se establece en true en Form1, y como he mencionado, funciona si arrastro texto en la forma, pero no un archivo real.

Estoy usando Vista de 64 bits ... no estoy seguro si eso es parte del problema.

Respuesta

20

El problema proviene de Vista UAC. DevStudio se ejecuta como administrador, pero el explorador se está ejecutando como un usuario normal. Cuando arrastra un archivo desde el explorador y lo deja caer en su aplicación alojada en DevStudio, es lo mismo que un usuario sin privilegios que intenta comunicarse con un usuario con privilegios. No está permitido.

Esto probablemente no aparezca cuando ejecute la aplicación fuera del depurador. A menos que lo ejecute como administrador allí (o si Vista detecta automáticamente que es una aplicación de instalación/instalación).

También podría run explorer as an admin, al menos para probar. O desactive el UAC (que no recomendaría, ya que realmente desea detectar estos problemas durante el desarrollo, no durante la implementación).

+0

Bueno, eso responde a un problema que he tenido con la aplicación en la que he estado trabajando. Una buena solución que encontré que le permite depurar la aplicación y aún tener el trabajo de arrastrar y soltar correctamente es ejecutar la aplicación fuera del depurador y luego adjuntar el depurador al proceso. – RobH

+0

En los casos en que no necesita Visual Studio para ejecutar elevado, también puede simplemente ejecutarlo en modo normal para probar la acción de arrastrar. Sin embargo, sugeriría instalar VSCommands. Es una extensión que le permite ejecutar una ventana del explorador como administrador, así como algunas otras cosas interesantes, como la selección automática de las instancias de IIS relacionadas para adjuntarlas a la depuración, entre otras cosas. –

0

El código que ha publicado debe funcionar.

trate de poner esto al comienzo del método DragEnter

string formats = string.Join("\n", e.Data.GetFormats(false)); 
MessageBox.Show(formats); 

que volcar formatos de datos asociados con la operación d'N'D. Podría ayudarnos a reducir el problema.

+0

@arul Lo hizo ... todavía no funcionó, pero encontró algo interesante. Eche un vistazo a mi respuesta. – mattruma

0

He añadido el código que arul mencioné y las cosas todavía no funcionaban, pero me hizo pensar.

Empecé a pensar que podría ser un problema de Vista, así que se lo envié a un amigo que tenía Windows XP y funcionó muy bien. Luego intenté ejecutarlo fuera de la carpeta Release en el directorio bin y ¡qué sabes que funcionó!

La única vez que no funciona es cuando lo estoy ejecutando dentro del IDE de Visual Studio 2008 ... eso es simplemente extraño.

+0

¿Está ejecutando Vis 'Studio como administrador? –

0

¿Intentó agregar el atributo STAThread al método principal?

[STAThread] 
    static void Main(string[] args) 
    { 
    } 

que tenían el mismo problema que @mattruma significado que no he arrastrar & eventos gota. Después de agregar el atributo STAThread al método principal, funcionó como se esperaba.

Cuestiones relacionadas