Glisser-déposer de l'Explorateur de fichiers Windows sur un Windows Form ne fonctionne pas

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

Question

Je ne parviens pas à faire glisser un fichier de l'Explorateur Windows vers une application Windows Forms.

Cela fonctionne bien lorsque je fais glisser du texte, mais pour une raison quelconque, il ne reconnaît pas le fichier. Voici mon code de test:

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 défini sur true sur Form1 et, comme je l'ai mentionné, cela fonctionne si je fais glisser du texte sur le formulaire, mais pas un fichier réel.

J'utilise Vista 64 bits ... je ne sais pas si cela fait partie du problème.

Était-ce utile?

La solution

Le problème vient de UAC de Vista. DevStudio fonctionne en tant qu'administrateur, mais explorer en tant qu'utilisateur normal. Lorsque vous faites glisser un fichier depuis l'explorateur et déposez-le sur votre application hébergée DevStudio, cela revient à un utilisateur non privilégié qui tente de communiquer avec un utilisateur privilégié. Ce n'est pas autorisé.

Cela ne s'affichera probablement pas lorsque vous exécuterez l'application en dehors du débogueur. Sauf si vous l'exécutez en tant qu'administrateur là-bas (ou si Vista détecte automatiquement qu'il s'agit d'une application d'installation / de configuration).

Vous pouvez également exécuter l'explorateur en tant qu'administrateur , à l'adresse le moins pour les tests. Ou désactivez UAC (ce que je ne recommanderais pas, car vous voulez vraiment résoudre ces problèmes pendant le développement, pas pendant le déploiement!)

Autres conseils

Le code que vous avez publié devrait fonctionner.

Essayez de placer ceci au début de la méthode DragEnter

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

qui dumpera les formats de données associés à l'opération d'n'd. Cela pourrait nous aider à cerner le problème.

J'ai ajouté le code que arul a été mentionné et les choses ne fonctionnaient toujours pas, mais cela m'a fait réfléchir.

J'ai commencé à penser qu'il pourrait s'agir d'un problème lié à Vista. Je l'ai donc envoyé à un ami qui possédait Windows XP et cela fonctionnait très bien! J'ai ensuite essayé de l'exécuter en dehors du dossier Release dans le répertoire bin et vous savez que cela a fonctionné!

La seule fois où cela ne fonctionne pas, c'est lorsque je l'exécute dans l'IDE de Visual Studio 2008 ... c'est vraiment bizarre.

Avez-vous essayé d'ajouter l'attribut STAThread à la méthode main?

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

J'ai eu le même problème que @mattruma, ce qui signifie que je n'ai pas eu d'événements Drag & Drop. Après avoir ajouté l'attribut STAThread à la méthode principale, il a fonctionné comme prévu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top