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

时间:2010-09-25 15:55:00

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

我构建了一个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 个答案:

答案 0 :(得分:7)

是的,你正在与UIPI作战,这是UAC的一个方面,它可以阻止未经高速发展的程序劫持高架程序的资源。是的,ChangeWindowMessageFilter()允许您绕过Windows邮件的此限制。

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