c# - Arrastrar y soltar desde Windows File Explorer a Windows Form no funciona
winforms drag-and-drop (4)
¿ STAThread
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 Drag & Drop. Después de agregar el atributo STAThread
al método principal, funcionó como se esperaba.
Tengo un problema al arrastrar un archivo desde el Explorador de Windows a una aplicación de 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 se establece en verdadero en Form1, y como mencioné, funciona si arrastro texto en el formulario, simplemente no es un archivo real.
Estoy usando Vista de 64 bits ... no estoy seguro si eso es parte del problema.
El código que publicaste 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 el problema.
El problema proviene del UAC de Vista. 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.
Es probable que esto no aparezca cuando ejecuta 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 puede ejecutar el explorador como administrador , al menos para realizar pruebas. O desactive el UAC (que no recomendaría, ya que realmente desea detectar estos problemas durante el desarrollo, ¡no durante la implementación!)
Agregué el código que arul mencionó y las cosas aún no funcionaron, 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ó de maravilla! 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.