8

我在将文件从 Windows 资源管理器拖动到 Windows 窗体应用程序时遇到问题。

当我拖动文本时它工作正常,但由于某种原因它无法识别文件。这是我的测试代码:

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 在 Form1 上设置为 true,正如我所提到的,如果我将文本拖到表单上,它就可以工作,而不是实际的文件。

我正在使用 Vista 64 位...不确定这是否是问题的一部分。

4

4 回答 4

20

问题来自 Vista 的UAC。DevStudio 以管理员身份运行,但 explorer 以普通用户身份运行。当您从资源管理器中拖动文件并将其放到 DevStudio 托管的应用程序上时,这与尝试与特权用户通信的非特权用户相同。这不被允许。

当您在调试器之外运行应用程序时,这可能不会显示。除非您在那里以管理员身份运行它(或者如果 Vista 自动检测到它是安装程序/设置应用程序)。

您也可以以管理员身份运行 explorer,至少用于测试。或者禁用 UAC(我不建议这样做,因为您真的想在开发过程中发现这些问题,而不是在部署过程中!)

于 2008-11-13T20:19:46.727 回答
0

您发布的代码应该可以工作。

试着把它放在 DragEnter 方法的开头

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

这将转储与 d'n'd 操作相关的数据格式。可能有助于我们缩小问题所在。

于 2008-11-11T18:32:10.867 回答
0

我添加了arul提到的代码,但事情仍然没有奏效,但它让我思考。

我开始认为这可能是一个 Vista 问题,所以我将它发送给了一个使用 Windows XP 的朋友,它运行良好!然后我尝试在 bin 目录中的 Release 文件夹之外运行它,你知道它有什么用!

唯一一次它不起作用是当我在 Visual Studio 2008 IDE 中运行它时......这很奇怪。

于 2008-11-11T21:58:29.140 回答
0

您是否尝试将STAThread属性添加到 main 方法?

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

我和@mattruma 有同样的问题,这意味着我没有拖放事件。将STAThread属性添加到 main 方法后,它按预期工作。

于 2012-09-27T16:14:27.660 回答