从 Windows 文件资源管理器拖放到 Windows 窗体不起作用

Posted

技术标签:

【中文标题】从 Windows 文件资源管理器拖放到 Windows 窗体不起作用【英文标题】:Drag and drop from Windows File Explorer onto a Windows Form is not working 【发布时间】:2010-09-21 20:31:48 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

嗯,这回答了我一直在处理的应用程序中遇到的一个问题。我发现一个允许您调试应用程序并仍然让拖放正常工作的好解决方法是在调试器之外运行应用程序,然后将调试器附加到进程。 在不需要 Visual Studio 运行提升的情况下,您也可以在正常模式下运行它来测试拖放。但是,我建议安装 VSCommands。它是一个扩展,允许您以管理员身份运行资源管理器窗口以及其他一些简洁的东西,例如在调试时自动选择要附加的相关 IIS 实例——除此之外。【参考方案2】:

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

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

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

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

【讨论】:

@arul 做到了……还是没用,但发现了一些有趣的东西。看看我的回答。【参考方案3】:

我添加了arul 提到的代码,但仍然无法正常工作,但这让我开始思考。

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

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

【讨论】:

您是否以管理员身份运行 Vis 的 Studio?【参考方案4】:

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

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

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

【讨论】:

以上是关于从 Windows 文件资源管理器拖放到 Windows 窗体不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何允许从 Windows 资源管理器拖放到 C# WPF 应用程序中?

从 Java Swing 应用程序拖放到 Windows 资源管理器

如何将图片从资源管理器拖放到 WPF 控件上?

启用从资源管理器拖放到 Run-As-Administrator 应用程序

将文件拖放到 wpf/C# 应用程序时,如何在 Windows 资源管理器中维护文件顺序?

文件拖放在列表框上不起作用