С# Перемещение перетаскивания не работает на Windows 7

У меня был проект довольно долго, используя winforms С#. Я реализовал функцию перетаскивания до того, как был выпущен Windows 7. Работал как шарм. Однако при использовании Windows 7 он не работает. Событие даже не запускается.

AllowDrop установлено значение true. При подписке на DragEnter он не вызывается в Windows 7 (не уверен в Vista). Но на XP он работает полностью. Программа запускается с административными привилегиями.

Есть ли разница в перетаскивании в Windows 7 vs xp? Не знаю, соответствует ли это, но я использую x64

Ответ 1

У исходных и целевых процессов должны быть совместимые уровни безопасности\привилегии. Например, если ваш источник является проводником, и он работает с привилегиями пользовательского уровня, но ваше целевое приложение работает с правами администратора (повышенного уровня), вы не сможете перетащить и отменить, так как это рассматривается как проблема безопасности, поскольку target работает с более высоким уровнем привилегий.

Ответ 2

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

  • Измените манифест, установите для атрибута uiAccess для элемента <requestedExecutionLevel> значение true.
  • Сохраните вашу программу EXE в подкаталоге c:\windows или c:\program files
  • Подпишите свой EXE с сертификатом из действующего правила подписи кода.

Никогда не пробовал это, ymmv.

Ответ 3

В своем приложении вызовите ChangeWindowMessageFilter со следующими значениями, чтобы разрешить перетаскивание в/из вашего приложения с повышенными правами и приложения с невыполненными приложениями, такими как Explorer:

ChangeWindowMessageFilter (WM_DROPFILES, MSGFLT_ADD);
ChangeWindowMessageFilter (WM_COPYDATA, MSGFLT_ADD);
ChangeWindowMessageFilter (0x0049, MSGFLT_ADD);

Ответ 4

A Незначительное дополнение к сообщению dmex. Далее определяются переменные и константа.

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

Кроме того, вы можете рассмотреть возможность использования ChangeWindowMessageFilterEx, если приложение находится в Windows 7. Я также считаю, что OLE-перетаскивание и drop может не использовать обмен сообщениями Windows. Так что это не повлияло бы на это вообще.

Ответ 5

Он может быть несвязанным, но у меня были неприятные проблемы с Drag-n-Drop в Windows 8. Он работал некоторое время, а затем переставал работать. Я не мог перетащить n-drop между Explorer, в редакторе и т.д. Оказывается, когда я взаимодействовал с виртуальной машиной Hyper-V, работающей под Windows 7, моя способность drag-n-drop была изменена (или, возможно, это была ctrl-alt-end, чтобы имитировать crtl-alt-delete для Hyper-V). В любом случае, одна из проблем возникла, следующее разрешило это:

Я нашел решение своей проблемы здесь: Fix Drag Drop Функциональность не работает в Windows 7 Vista XP

В основном решение было:

Щелкните левой кнопкой мыши по файлу в проводнике и, удерживая нажатой кнопку мыши, нажмите [Esc], затем [Ctrl], затем отпустите кнопку мыши. Я должен предположить, что это сброс какой-либо настройки доступности или что-то в этом роде.

Ответ 6

У меня была такая же проблема при отладке приложения С# на рабочем столе от VS 2015 и Windows 7 x64 в качестве S.O. Это было связано с правами администратора, примененными к ярлыку моей VS IDE на рабочем столе (см. Снимок экрана). Устранение этой опции. События перетаскивания и перетаскивания правильны.

Спасибо TimLloyd за помощь.

введите описание изображения здесь