启用从资源管理器拖放到 Run-As-Administrator 应用程序

Posted

技术标签:

【中文标题】启用从资源管理器拖放到 Run-As-Administrator 应用程序【英文标题】:Enable drag&drop from explorer to Run-As-Administrator application 【发布时间】:2011-04-17 04:56:04 【问题描述】:

我构建了一个 winforms 应用程序,并实现了拖放功能。此功能在 WinXP 或 Win7 中的 Run-As-Administrator 应用程序中运行良好。

从Win7中的非管理员应用程序拖动到我的程序时出现问题,它只是无法正常工作。

我理解这一点是因为操作系统会过滤消息。我在这里找到了解决方案:http://blog.helgeklein.com/2010/03/how-to-enable-drag-and-drop-for.html,但它似乎不起作用。

这里是解决方法代码:

    [DllImport("user32.dll", SetLastError = true)]
    static extern bool ChangeWindowMessageFilter(uint message, uint dwFlag);

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

    ChangeWindowMessageFilter(WM_DROPFILES, MSGFLT_ADD);
    ChangeWindowMessageFilter(WM_COPYDATA, MSGFLT_ADD);
    ChangeWindowMessageFilter(WM_COPYGLOBALDATA, MSGFLT_ADD);

如何让它发挥作用?

【问题讨论】:

【参考方案1】:

是的,您正在与 UIPI 作斗争,这是 UAC 的一个方面,它可以防止未提升的程序劫持提升的程序的资源。是的,ChangeWindowMessageFilter() 允许您绕过 Windows 消息的此限制。

但是,OLE 拖放不使用 Windows 消息。它使用回调,请查看 RegisterDragDrop() 的文档以获取详细信息。这个 microsoftie blog post 告诉您,尽管它为 CWMF 打开了大门,但您已经搞砸了。然而,我完全不清楚如何获取 WM_DROPFILES 消息。在示例 Windows 窗体应用程序中使用 DragAcceptFiles() 没有明显的效果。

【讨论】:

史诗般的失败在微软方面。他们需要重新考虑他们的操作系统设计,以便旧程序继续工作,正如他们声称的那样。我有一个需要以管理员身份访问文件的应用程序,它使用拖放作为其主要交互模式来处理文件,基本上他们说“太糟糕了,它不再起作用了”,至少不能使用 Explorer .最好的解决方法可能是通过使用可以提升的替代文件浏览器从等式中删除 Explorer,因为 Explorer 无法轻松提升是阻碍设计工作的原因。

以上是关于启用从资源管理器拖放到 Run-As-Administrator 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

如何将图片从资源管理器拖放到 WPF 控件上?

从 Windows 文件资源管理器拖放到 Windows 窗体不起作用

从 Windows 资源管理器拖放到我的应用程序的文本框

从 Java Swing 应用程序拖放到 Windows 资源管理器

绕过 UAC 以允许从非提升源拖放到我们提升的应用程序

将文件拖放到 wpf/C# 应用程序时,如何在 Windows 资源管理器中维护文件顺序?