Arraste e solte do Windows File Explorer para um formulário do Windows não está funcionando

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

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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top