从用户进程拖放到提升的进程

时间:2011-03-09 18:21:58

标签: c# .net windows-7

我有一个C#应用程序,需要使用runas进行提升才能运行某些功能。我现在遇到的问题是,我附有拖放功能的图片框在runas之后无效。我整晚都在看帖子,所以我很熟悉原因。我还发现了很多关于通过过滤器接受这些消息的信息。 http://msdn.microsoft.com/en-us/library/ms632675(v=VS.85).aspx

我还没有找到,我希望有人可以帮我解决这个问题,代码是如何以及在何处实现的。我一直在尝试各种方法,我无法让它工作。这是一段代码,试图让它工作。顺便说一句,我也尝试使用清单中的过滤器进行更改,但是也没有去过那里。提前感谢任何人提供的帮助。

public partial class Form1 : Form
{
    [DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr ChangeWindowMessageFilter(uint message, uint dwFlag);

    public Form1()
    {
        InitializeComponent();
        ChangeWindowMessageFilter(WM_DROPFILES, MSGFLT_ADD);
        ChangeWindowMessageFilter(WM_COPYDATA, MSGFLT_ADD);
        ChangeWindowMessageFilter(0x0049, MSGFLT_ADD);
        GetAndDisplayRights();
    }

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

2 个答案:

答案 0 :(得分:5)

这是不可能的,也没有解决方法。 D + D不能将对象从一个未升级的对象中删除。 UIPI(UAC的UI组件)阻止了这一点。 ChangeWindowMessageFilter()变通方法不起作用,D + D不是基于消息的,它使用COM。 WM_DROPFILES可以追溯到Windows 3,不再使用。

我怀疑Windows的某些未来版本提供了一种解决方法,从Windows 7开始就不可能。

答案 1 :(得分:0)

以下是我解决此问题的方法。

我在表单中嵌入了目录列表和文件列表,并为文件列表设置了鼠标单击侦听器。我将其配置为仅显示图像文件,并且一旦单击图像,它就会被设置为图片框图像。这不是拖放,但非常接近。最重要的是,无论应用程序的权限级别如何,它都可以正常工作。