С# Перемещение перетаскивания не работает на 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 за помощь.
![введите описание изображения здесь]()