【问题标题】:C# Drag drop does not work on windows 7C# 拖放在 Windows 7 上不起作用
【发布时间】:2011-02-19 11:52:04
【问题描述】:

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

AllowDrop 设置为真。当订阅DragEnter 时,它不会在 Windows 7 中被调用(不确定 vista)。但在 XP 上它一直有效。该程序以管理员权限运行。

windows 7 和 xp 中的拖放有什么不同吗?不知道是否相关,但我使用的是 x64

【问题讨论】:

  • 我在一个新的 Silverlight 项目中遇到了类似的问题。由于我的浏览器的安全功能,拖放不起作用。你在你的 winforms 中使用浏览器控件吗?
  • 我注意到在 Windows 7 中运行具有提升权限的应用程序时,拖放功能被禁用。

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


【解决方案1】:

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

【讨论】:

  • 这似乎是正确的。我尝试使用管理权限运行 IE 并从 IE 拖放,它工作正常。也有道理,但很烦人
  • 应该提供动力去改变你需要改变的东西,这样你的应用就可以作为标准用户运行。例如,不要写入程序文件、HKLM 等。
  • @Kate 以提升权限运行的原因是我需要启动和停止服务:)
  • @Oskar Kjellin 好吧,如果您仍然需要拖放,请将需求提升部分分开,并将它们作为单独的提升进程启动,以便主要部分可以是标准用户。
  • 太糟糕了,Windows 没有告诉用户它正在这样做。据用户(和开发人员!)所知,该应用程序不再像以前那样支持拖放。我的应用程序可以以普通用户身份运行,但我以管理员身份运行 VS,以便它可以注册 COM DLL。
【解决方案2】:

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

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

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

【讨论】:

  • +1 不错的答案 :) 感谢您了解如何解决它。但是对我来说不值得:)
【解决方案3】:

在您的应用程序中,使用以下值调用 ChangeWindowMessageFilter,以允许拖放到您的提升应用程序和非提升应用程序(如 Explorer)中/从其中拖放:

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

【讨论】:

  • 拖放不再使用Window消息,ChangeWindowMessageFilter不起作用。
  • @HansPassant 你能提供一些细节吗?
  • @ken2k - 除此之外没有什么好说的了。 D+D 现在在 COM 中实现,IDropSource 和 IDropTarget 是核心接口。
【解决方案4】:

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 消息传递。所以它根本不会影响。

【讨论】:

    【解决方案5】:

    这可能无关紧要,但我在使用 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],然后松开鼠标按钮。我不得不假设这是在重置一些可访问性设置或其他东西。

    【讨论】:

      【解决方案6】:

      从 VS 2015 和 Windows 7 x64 作为 S.O. 调试桌面 C# 应用程序时,我遇到了同样的问题。 这是由于 管理员权限 应用于桌面中我的 VS IDE 的快捷方式(见屏幕截图)。取消选中此选项拖放事件正确引发。

      感谢 TimLloyd 的帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-06
        • 1970-01-01
        • 2011-05-05
        • 2017-09-03
        • 2011-05-29
        相关资源
        最近更新 更多