代码之家  ›  专栏  ›  技术社区  ›  Oskar Kjellin

C拖放不适用于Windows 7

  •  44
  • Oskar Kjellin  · 技术社区  · 15 年前

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

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

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

    6 回复  |  直到 7 年前
        1
  •  75
  •   Tim Lloyd    15 年前

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

        2
  •  17
  •   Hans Passant    15 年前

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

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

    从未尝试过,YMMV。

        3
  •  1
  •   dmex    14 年前

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

    ChangeWindowMessageFilter (WM_DROPFILES, MSGFLT_ADD);
    ChangeWindowMessageFilter (WM_COPYDATA, MSGFLT_ADD);
    ChangeWindowMessageFilter (0x0049, MSGFLT_ADD);
    
        4
  •  1
  •   BlndLeadingDef    14 年前

    对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;
    

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

        5
  •  1
  •   Metro    12 年前

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

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

    基本上解决方案是:

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

        6
  •  0
  •   mggSoft    7 年前

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

    感谢Timloyd的帮助。

    应用于桌面上的my vs ide快捷方式(请参见屏幕截图)。取消选中此选项将正确引发拖放事件。

    感谢Timloyd的帮助。

    enter image description here