关于.net:C#拖放在Windows 7上不起作用

C# Drag drop does not work on windows 7

我有一个使用C WinForms的项目已经有很长一段时间了。在Windows7发布之前,我实现了一个拖放功能。工作很有魅力。但是,当使用Windows7时,它不起作用。事件甚至不会被触发。

AllowDrop设置为真。订阅DragEnter时,在Windows7中不会调用它(不确定Vista)。但在XP上,它一直都能工作。程序以管理员权限运行。

在Windows7和XP中拖放有什么区别吗?不知道是否相关,但我使用的是X64


源进程和目标进程需要具有兼容的安全级别特权。例如,如果源是资源管理器,并且它以用户级权限运行,但目标应用程序以管理员(提升的)级权限运行,则无法拖放,因为这被视为安全问题,因为目标以更高级别的权限运行。


它被称为uipi,用户界面特权隔离。旨在防止使用受限权限运行的程序进行输入注入攻击。它可以被禁用,您需要执行以下操作:

  • 修改清单,将元素的uiaccess属性设置为true。
  • 将程序的exe存储在c:windows或c:program files的子目录中
  • 使用有效代码签名机构的证书对exe进行签名

从未尝试过,YMMV。


这可能是无关的,但我在Windows8上遇到了严重的拖放问题。它会工作一段时间,然后停止工作。我无法在资源管理器之间、在编辑器中等等进行拖放操作。结果发现,当我与运行Windows7的Hyper-V虚拟机交互时,我的拖放功能发生了变化(或者可能是用ctrl-alt-end键来模拟crtl-alt-delete到Hyper-V)。在任何情况下,一旦出现问题,以下问题就解决了:

我在这里找到了解决问题的方法:修复Windows 7 Vista XP中不工作的拖放功能

基本上解决方案是:

在资源管理器中左键单击一个文件,按住鼠标按钮的同时,按[Esc]然后按[Ctrl],然后释放鼠标按钮。我必须假设这是重置了一些可访问性设置或其他设置。


对DMEX职位的一个小小的补充。下面定义变量和常量。

1
2
3
4
private const uint WM_DROPFILES = 0x233;
private const uint WM_COPYDATA = 0x004A;
private const uint WM_COPYGLOBALDATA = 0x0049;
private const uint MSGFLT_ADD = 1;

另外,如果您的应用程序在Windows7上,您可能会考虑使用ChangeWindowMessageFilterEx。我还认为,OLE拖放可能不使用Windows消息传递。所以这一点也不会产生影响。


在应用程序中,使用以下值调用ChangeWindowMessageFilter,以允许在提升的应用程序和非提升的应用程序(如资源管理器)之间拖放:

1
2
3
ChangeWindowMessageFilter (WM_DROPFILES, MSGFLT_ADD);
ChangeWindowMessageFilter (WM_COPYDATA, MSGFLT_ADD);
ChangeWindowMessageFilter (0x0049, MSGFLT_ADD);


我在从vs 2015和Windows7x64调试桌面C应用程序时遇到了和S.O相同的问题。这是因为管理员权限应用于桌面中我的vs ide快捷方式(请参见屏幕截图)。取消选中此选项将正确引发拖放事件。

感谢Timloyd的帮助。

enter image description here