Arrastrar y soltar desde el Explorador de archivos de Windows en un formulario de Windows no funciona

StackOverflow https://stackoverflow.com/questions/281706

Pregunta

Tengo un problema al arrastrar un archivo desde el Explorador de Windows a una aplicación de formularios Windows Forms.

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 está establecido en verdadero en Form1, y como mencioné, funciona si arrastro el texto al formulario, pero no un archivo real.

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

¿Fue útil?

Solución

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

Esto probablemente no se mostrará 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 ejecutar el explorador como administrador , en menos para probar. O deshabilite UAC (que no recomendaría, ya que realmente desea detectar estos problemas durante el desarrollo, no durante la implementación)

Otros consejos

El código que publicó debería funcionar.

Intenta poner esto al comienzo del método DragEnter

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

que volcará los formatos de datos asociados con la operación d'n'd. Podría ayudarnos a reducir dónde radica el problema.

Agregué el código que arul mencionado y las cosas todavía no funcionaban, pero me hizo pensar.

Empecé a pensar que podría ser un problema de Vista, así que 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 extraño.

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

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

Tuve el mismo problema que @mattruma, lo que significa que no obtuve eventos de arrastrar y soltar. Después de agregar el atributo STAThread al método principal, funcionó como se esperaba.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top