启用从资源管理器拖放到以管理员身份运行应用程序

问题描述 投票:0回答:1

我构建了一个 winforms 应用程序,并实现了拖放功能。此功能在 WinXP 或 Win7 中通过“以管理员身份运行”应用程序运行良好。

当尝试从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);

如何让它发挥作用?

c# .net windows-7 drag-and-drop uac
1个回答
9
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.