2008-11-11 63 views
8

我遇到了将文件从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; 
      } 
     } 
    } 
} 

的AllowDrop设置为true Form1上,正如我所提到的,它的工作原理,如果我拖动文本上的形式,只是没有实际的文件。

我使用Vista 64位...不知道这是否是问题的一部分。

回答

20

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

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

您也可以run explorer as an admin,至少用于测试。或者禁用UAC(我不建议这么做,因为你真的想在开发过程中捕获这些问题,而不是在部署过程中)

+0

那么,这就解决了我一直在处理的应用程序中遇到的问题。我发现一个很好的解决方法,允许您调试应用程序,并且仍然具有拖放功能,即在调试器外部运行应用程序,然后将调试器附加到进程。 – RobH 2011-05-06 20:36:23

0

您发布的代码应该工作。

尝试把这个在为dragenter方法

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

将转储与德n'd操作的数据格式的开始。可以帮助我们缩小问题所在。

+0

@arul做到了......仍然没有工作,但发现了一些有趣的东西。看看我的答案。 – mattruma 2008-11-11 21:51:54

0

我添加了代码arul提到的东西仍然没有工作,但它让我思考。

我开始认为这可能是一个Vista问题,所以我把它发送给一个有Windows XP的朋友,它运行得很好!然后我试着在bin目录的Release文件夹外面运行它,并且你知道它的工作原理!

唯一不工作的时候,我在Visual Studio 2008 IDE中运行它......这很奇怪。

+0

您是否以管理员身份运行Vis'Studio? – 2010-01-16 07:33:54

0

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

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

我有同样的问题,因为@mattruma这意味着我得到了不能拖动&丢弃事件。 将STAThread属性添加到主方法后,其按预期工作。

相关问题