C#拖放不适用于Windows 7

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

AllowDrop设置为true。 当订阅DragEnter它不会在Windows 7中调用(不知道Vista)。 但在XP上它一路工作。 该程序与pipe理权限运行。

在Windows 7与XP中的拖放有没有什么区别? 不知道是否相关,但我使用的是x64

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

它被称为UIPI,用户界面特权隔离。 旨在防止从具有有限特权的程序中input注入漏洞。 它可以被禁用,你需要这样做:

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

从来没有尝试过这个,ymmv。

在您的应用程序中,使用以下值调用ChangeWindowMessageFilter,以允许从高级应用程序和像Explorer那样的非高级应用程序中拖放:

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

dmex的post的一个小的补充。 下面定义variables和常量。

 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消息传递。 所以根本不会有这个效果

这可能是不相关的,但是我在Windows 8上遇到了一些糟糕的拖放问题。它会工作一段时间,然后停止工作。 我不能在资源pipe理器和编辑器之间进行拖放。事实certificate,当我与运行Windows 7的Hyper-V虚拟机进行交互时,我的拖放function被改变了(或者也许是ctrl-alt-end keystroke来模拟crtl-alt-delete到Hyper-V)。 无论如何,一个问题发生了,下面解决了它:

我发现我的问题的解决scheme在这里: 修复拖放function不能在Windows 7 Vista XP中工作

基本上解决scheme是:

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

从VS 2015和Windows 7 x64debugging桌面C#应用程序时,我遇到了同样的问题。这是由于我的VS IDE在桌面的快捷方式上应用了pipe理员权限 (请参见屏幕截图)。 取消选中此选项拖放事件正确提升。

感谢TimLloyd的帮助。

在这里输入图像描述