Как использовать drag & drop в c # wpf с правами администратора - PullRequest
0 голосов
/ 22 февраля 2019

Я могу использовать перетаскивание, чтобы перетащить файл из проводника в какой-то элемент управления, когда я не использую права администратора, но мне нужны права администратора.Когда я использую это, я не могу сделать это.Я знаю, что это из-за UIPI, сообщение ни от какого процесса не может вызвать процесс повышения.

Итак, в app.manifest я использую

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

После инициализации MainWindow он запускает метод MainWindow ViewModel

        private void MetroWindow_Loaded(object sender, RoutedEventArgs e)
    {
        const uint WM_DROPFILES = 0x233;
        const uint WM_COPYDATA = 0x4a;
        const uint WM_COPYGLOBALDATA = 0x49;
        CHANGEFILTERSTRUCT changeStruct = new CHANGEFILTERSTRUCT();
        changeStruct.size = Convert.ToUInt32(Marshal.SizeOf(typeof(CHANGEFILTERSTRUCT)));
        ChangeWindowMessageFilter(WM_DROPFILES, MSGFLT_ADD);
        ChangeWindowMessageFilter(WM_COPYDATA, MSGFLT_ADD);
        ChangeWindowMessageFilter(WM_COPYGLOBALDATA, MSGFLT_ADD);
        //bool res1 = ChangeWindowMessageFilterEx((HwndSource.FromVisual(App.Current.MainWindow as MainWindow) as HwndSource).Handle, WM_DROPFILES, ChangeWindowMessageFilterExAction.Allow, ref changeStruct);
        //bool res2 = ChangeWindowMessageFilterEx((HwndSource.FromVisual(App.Current.MainWindow as MainWindow) as HwndSource).Handle, WM_COPYGLOBALDATA, ChangeWindowMessageFilterExAction.Allow, ref changeStruct);
        //bool res3 = ChangeWindowMessageFilterEx((HwndSource.FromVisual(App.Current.MainWindow as MainWindow) as HwndSource).Handle, WM_COPYDATA, ChangeWindowMessageFilterExAction.Allow, ref changeStruct);

    }
    public enum MessageFilterInfo : uint
    {
        None = 0, AlreadyAllowed = 1, AlreadyDisAllowed = 2, AllowedHigher = 3
    };

    public enum ChangeWindowMessageFilterExAction : uint
    {
        Reset = 0, Allow = 1, DisAllow = 2
    };

    [StructLayout(LayoutKind.Sequential)]
    public struct CHANGEFILTERSTRUCT
    {
        public uint size;
        public MessageFilterInfo info;
    };

    [DllImport("user32.dll", SetLastError = true)]
    public static extern bool ChangeWindowMessageFilterEx(IntPtr hWnd, uint msg, ChangeWindowMessageFilterExAction action, ref CHANGEFILTERSTRUCT changeInfo);

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

Я пытаюсь использовать ChangeWindowMessageFilter и ChangeWindowMessageFilterEx, но все они нене работаетвторой возвращает true, но changeInfo.info - none.

Знаете, что я делаю неправильно?

Заранее спасибо.

...