从Windows文件资源管理器拖放到Windows窗体上无法正常工作
-
07-07-2019 - |
题
我在将文件从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 );
将转储与该操作相关联的数据格式。可能会帮助我们缩小问题所在。
我添加了 arul 提到,事情仍然没有奏效,但它让我思考。
我开始认为这可能是一个Vista问题所以我把它发送给了一个拥有Windows XP的朋友,它运行得很好!然后我尝试在bin目录中的Release文件夹之外运行它,你知道它有用吗!
它唯一不起作用的是我在Visual Studio 2008 IDE中运行它...这很奇怪。
您是否尝试将 STAThread
属性添加到main方法?
[STAThread]
static void Main(string[] args)
{
}
我和@mattruma有同样的问题,这意味着我没有拖拽和放弃事件。
将 STAThread
属性添加到main方法后,它按预期工作。