从Windows文件资源管理器拖放到Windows表单上不起作用。

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;
            }
        }
    }
}

在Form1上设置了AllowDrop为true,正如我所提到的,如果我拖动文本到表单上,它可以工作,但是无法拖动实际文件。

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

4个回答

20

问题出在Vista的UAC上。DevStudio作为管理员运行,但资源管理器是以普通用户身份运行的。当你从资源管理器中拖动一个文件并将其放到你的DevStudio托管应用程序上时,这相当于非特权用户试图与特权用户通信。这是不允许的。

如果你在调试器外运行应用程序,这个问题可能就不会出现。除非你在那里以管理员身份运行它(或者如果Vista自动检测到它是一个安装程序/设置程序)。

你也可以将资源管理器作为管理员运行,至少用于测试。或者禁用UAC(我不建议这样做,因为你真正想在开发过程中捕获这些问题,而不是在部署过程中!)


这解决了我一直在处理的应用程序问题。我发现一个好的解决方法,可以让你调试应用程序并且仍然能够正常使用拖放功能,那就是在调试器外运行应用程序,然后将调试器附加到进程上。 - RobH
在不需要将Visual Studio提高权限运行的情况下,您也可以以普通模式运行它来测试拖放功能。但是,我建议安装VSCommands。它是一个扩展程序,允许您以管理员身份运行资源管理器窗口,以及一些其他有趣的功能,比如在调试时自动选择相关的IIS实例进行附加等等。 - Timothy Lee Russell

0

我添加了arul提到的代码,但事情仍然没有起色,不过这让我开始思考。

我开始想这可能是一个Vista的问题,所以我把它发送给一个拥有Windows XP的朋友,它运行得非常好!然后我尝试在bin目录中的Release文件夹外运行它,你知道吗? 它工作了!

唯一不能工作的时候是当我在Visual Studio 2008 IDE内运行它... 真奇怪。


你是否以管理员身份运行了Vis' Studio? - jay_t55

0
你发布的代码“应该”能够工作。 尝试将此代码放置在DragEnter方法的开头。
string formats = string.Join( "\n", e.Data.GetFormats(false) );
MessageBox.Show( formats );

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


@arul 我试了一下...还是不行,但是发现了一些有趣的东西。看看我的回答。 - mattruma

0
你尝试在主方法中添加STAThread属性了吗?
  [STAThread]
  static void Main(string[] args)
  {
  }

我遇到了和 @mattruma 一样的问题,也就是无法获取拖放事件。 在主方法中添加 STAThread 属性后,它按预期工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接