Arraste e solte do Windows File Explorer para um formulário do Windows não está funcionando
-
07-07-2019 - |
Pergunta
Estou tendo um problema de arrastar um arquivo do Windows Explorer para um aplicativo Windows Forms.
Funciona bem quando eu arrasto o texto, mas, por algum motivo, não está reconhecendo o arquivo. Aqui está o meu código de teste:
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;
}
}
}
}
O AllowDrop está definido como true no Form1 e, como eu mencionei, ele funciona se eu arrastar o texto para o formulário, apenas não um arquivo real.
Estou usando o Vista de 64 bits ... não tenho certeza se isso faz parte do problema.
Solução
O problema vem do Vista's Uac. O DevStudio está em execução como administrador, mas o Explorer está sendo executado como um usuário regular. Quando você arrasta um arquivo do Explorer e o solta no seu aplicativo hospedado devstudio, é o mesmo que um usuário não privilegiado tentando se comunicar com um usuário privilegiado. Não é permitido.
Provavelmente isso não aparecerá quando você executar o aplicativo fora do depurador. A menos que você o execute como um administrador lá (ou se o Vista detectar automaticamente que é um aplicativo de instalador/instalação).
Você também pode Run Explorer como um administrador, pelo menos para teste. Ou desative a UAC (que eu não recomendaria, já que você realmente deseja pegar esses problemas durante o desenvolvimento, não durante a implantação!)
Outras dicas
O código que você postou deve trabalhar.
Tente colocar isso no início do método dragenter
string formats = string.Join( "\n", e.Data.GetFormats(false) );
MessageBox.Show( formats );
que despejará formatos de dados associados à operação D'N'D. Pode nos ajudar a diminuir onde está o problema.
Eu adicionei o código que arul mencionado e as coisas ainda não funcionaram, mas isso me fez pensar.
Comecei a pensar que poderia ser um problema do Vista, então o enviei para um amigo que tinha o Windows XP e funcionou muito bem! Tentei então executá -lo fora da pasta de liberação no diretório da bin e o que você sabe que funcionou!
A única vez que não funciona é quando estou executando o IDE Visual Studio 2008 ... isso é estranho.
Você tentou adicionar o STAThread
atributo ao método principal?
[STAThread]
static void Main(string[] args)
{
}
Eu tive o mesmo problema que @mattruma, o que significa que não recebi eventos de arrastar e soltar. Depois de adicionar o STAThread
atributo ao método principal que funcionou conforme o esperado.