我使用C#winforms已经有一段时间了。我在Windows 7发布之前实现了拖放功能。工作就像一个魅力。但是,使用Windows 7时它不起作用。该事件甚至没有被触发。
AllowDrop
设置为true。订阅DragEnter
时,它不会在Windows 7中调用(不确定vista)。但是在XP上它一直都有效。该程序使用administritave priviliges运行。
Windows 7与xp的拖拽有什么不同吗?不知道它是否相关,但我使用的是x64
答案 0 :(得分:77)
源进程和目标进程需要具有兼容的安全级别\权限。例如,如果您的源是资源管理器并且它以用户级别权限运行,但您的目标应用程序以管理员(提升)级别权限运行,则您将无法拖放,因为这被视为安全问题,因为目标正以更高级别的权限运行。
答案 1 :(得分:17)
它被称为UIPI,用户界面权限隔离。旨在防止来自具有受限特权的程序的输入注入攻击。它可以被禁用,你需要这样做:
<requestedExecutionLevel>
元素的uiAccess属性设置为true。从未尝试过这个,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)