Не могу точно сказать, почему ваши исходные файлы не удаляются.Да, у вас, скорее всего, нет прав на их удаление, только на их копирование.Это документированная возможность MoveFileEx()
:
MOVEFILE_COPY_ALLOWED
2 (0x2)
, если файл необходимо переместить на другой том, функция имитирует перемещение с помощью функций CopyFile и DeleteFile.
Если файл успешно скопирован на другой том и исходный файл не может быть удален, функция успешно покидает исходный файлбез изменений.
Это значение нельзя использовать с MOVEFILE_DELAY_UNTIL_REBOOT.
Однако, что касается DragTarget
, когда вы запускаете приложение с повышенными правами, оно работает с более высоким уровнем целостностии «Изоляция привилегий пользовательского интерфейса» (UIPI) блокирует процессы с более низкой целостностью от взаимодействия с пользовательскими интерфейсами процессов с более высокой целостностью.В этом случае UIPI блокирует перетаскивание из процесса с более низким уровнем целостности доступа к вашему окну, поэтому DragTarget
не вызывается, и нет способа (о котором я знаю) предотвратить это.
У вас есть несколько вариантов:
Не повышайте уровень качества своего приложения, чтобы оно работало на том же уровне целостности, что и большинство других приложений без повышенных прав.Поднимите только тот код, который должен быть повышен, т.е. вызов MoveFileEx()
.Вы можете:
Создать отдельный процесс для вызова MoveFileEx()
, используя ShellExecute/Ex()
с глаголом runas
.Это может быть отдельный EXE-файл или ваш основной EXE-файл с добавленными параметрами командной строки, чтобы указать ему, что делать.
поместите MoveFileEx()
в COM-объект, который выпри необходимости создайте экземпляр с помощью COM Elevation Moniker .
, если вам необходимо поднять приложение, а затем внедрить отдельное приложение без повышенных прав, чтобы приниматьотбрасывает, а затем передает отброшенные данные в ваше приложение с повышенными правами, используя механизм IPC, который не блокирует UIPI, например сокет.
пусть ваше приложение обрабатывает сообщение окна WM_DROPFILES
вместоиспользования DragTarget
.Используйте ChangeWindowMessageFilter/Ex()
, чтобы разрешить прохождение оконных сообщений WM_COPYDATA
, WM_DROPFILES
и WM_COPYGLOBALDATA
через UIPI.Таким образом, вы сможете, по крайней мере, перетаскивать файлы в свое приложение, но никакие другие виды данных, которые DragTarget
в противном случае не позволили бы.