Перетаскивание из проводника Windows в форму Windows не работает

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

Вопрос

У меня проблема с перетаскиванием файла из Windows Explorer в приложение Windows Forms.

Хорошо работает, когда я перетаскиваю текст, но по какой-то причине не распознает файл. Вот мой тестовый код:

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 имеет значение true в Form1, и, как я уже говорил, он работает, если я перетаскиваю текст в форму, а не в реальный файл.

Я использую Vista 64-bit ... не уверен, что это является частью проблемы.

Это было полезно?

Решение

Проблема возникает из-за UAC в Vista . DevStudio работает от имени администратора, но проводник работает от имени обычного пользователя. Когда вы перетаскиваете файл из проводника и помещаете его в приложение, размещенное на DevStudio, это аналогично непривилегированному пользователю, пытающемуся связаться с привилегированным пользователем. Это не разрешено.

Вероятно, это не будет отображаться при запуске приложения вне отладчика. Если вы не запустите его от имени администратора (или если Vista автоматически обнаружит, что это приложение для установки / настройки).

Вы также можете запустить проводник в качестве администратора , на странице хотя бы для тестирования. Или отключите UAC (что я бы не советовал, поскольку вы действительно хотите уловить эти проблемы во время разработки, а не во время развертывания!)

Другие советы

Отправленный вами код должен работать.

Попробуйте поместить это в начало метода DragEnter

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

, который будет выгружать форматы данных, связанные с операцией d'n'd. Может помочь нам сузить суть проблемы.

Я добавил код, который arul упоминается, и все еще не работает, но это заставило меня задуматься.

Я начал думать, что это может быть проблема с Vista, поэтому я отправил ее другу, у которого была Windows XP, и она отлично работала! Затем я попытался запустить его за пределами папки Release в каталоге bin и что вы знаете, это сработало!

Единственный раз, когда он не работает, это когда я запускаю его в IDE Visual Studio 2008 ... это просто странно.

Вы пытались добавить атрибут STAThread в метод main?

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

У меня была та же проблема, что и у @mattruma, то есть у меня не было событий Drag & amp; Drop. После добавления атрибута STAThread к основному методу он работал как ожидалось.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top