C#拖放在Windows 7上不起作用

时间:2010-05-14 11:22:30

标签: c# .net windows-7 drag-and-drop

我使用C#winforms已经有一段时间了。我在Windows 7发布之前实现了拖放功能。工作就像一个魅力。但是,使用Windows 7时它不起作用。该事件甚至没有被触发。

AllowDrop设置为true。订阅DragEnter时,它不会在Windows 7中调用(不确定vista)。但是在XP上它一直都有效。该程序使用administritave priviliges运行。

Windows 7与xp的拖拽有什么不同吗?不知道它是否相关,但我使用的是x64

6 个答案:

答案 0 :(得分:77)

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

答案 1 :(得分:17)

它被称为UIPI,用户界面权限隔离。旨在防止来自具有受限特权的程序的输入注入攻击。它可以被禁用,你需要这样做:

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

从未尝试过这个,ymmv。

答案 2 :(得分:1)

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

ChangeWindowMessageFilter (WM_DROPFILES, MSGFLT_ADD);
ChangeWindowMessageFilter (WM_COPYDATA, MSGFLT_ADD);
ChangeWindowMessageFilter (0x0049, MSGFLT_ADD);

答案 3 :(得分:1)

dmex帖子的一小部分内容。 以下定义变量和常量。

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

此外,如果您的应用程序在Windows 7上,您可能需要考虑使用ChangeWindowMessageFilterEx。我还认为OLE拖放可能不会使用Windows消息传递。所以它根本不会影响。

答案 4 :(得分:1)

它可能是无关的,但我在Windows 8中遇到了拖拽拖拽问题。它会工作一段时间然后停止工作。我无法在资源管理器,编辑器等之间拖放。事实证明,当我与运行Windows 7的Hyper-V VM进行交互时,我的拖放能力发生了变化(或者可能是ctrl-alt-end键击以模拟crtl-alt-delete到Hyper-V)。无论如何,一个问题发生了,以下解决了它:

我在这里找到了解决问题的方法: Fix Drag Drop Functionality Not Working In Windows 7 Vista XP

基本上解决方案是:

左键单击资源管理器中的文件,在按住鼠标按钮的同时,按[Esc],然后按[Ctrl],然后释放鼠标按钮。我必须假设这是重置一些辅助功能设置或其他东西。

答案 5 :(得分:0)

从VS 2015和Windows 7 x64调试桌面C#应用程序时,我遇到了同样的问题。 这是由于管理员权限应用于桌面中我的VS IDE的快捷方式(参见屏幕截图)。取消选中此选项Drag&amp;丢弃事件正常提升。

感谢TimLloyd的帮助。

enter image description here