从Windows文件资源管理器拖放到Windows窗体上无法正常工作

我在将文件从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位…不确定这是否是问题的一部分。

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

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

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

您发布的代码应该有效。

尝试将它放在DragEnter方法的开头

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

这将转储与d’d’d操作相关的数据格式。 可能会帮助我们缩小问题所在。

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

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

它唯一不起作用的是我在Visual Studio 2008 IDE中运行它…这很奇怪。

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

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

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