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

DxC*_*xCK 3 .net c# uac drag-and-drop windows-7

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

当从Win7中的非管理应用程序拖动到我的程序时,问题就变成了,它只是不起作用.

我理解这一点是因为OS过滤了消息.我在这里找到了一个解决方案: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);
Run Code Online (Sandbox Code Playgroud)

如何使它工作?

Han*_*ant 7

是的,你正在与UIPI作斗争,这是UAC的一个方面,可以防止未经加工的程序劫持高架程序的资源.是的,ChangeWindowMessageFilter()允许您绕过Windows邮件的此限制.

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

  • 微软的史诗失败了.他们需要重新考虑他们的操作系统设计,以便旧程序继续工作,因为他们声称他们应该这样做.我有一个应用程序,需要以管理员身份访问文件,它使用拖放作为其主要交互模式来处理文件,基本上他们说"太糟糕了,它将不再起作用",至少不会使用资源管理器.最好的解决方法可能是通过使用可升级的替代文件浏览器从等式中删除Explorer,因为资源管理器无法轻易提升是阻止设计工作的原因. (3认同)