C # Drag Drop не работает на Windows 7 - PullRequest
45 голосов
/ 14 мая 2010

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

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

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

Ответы [ 6 ]

77 голосов
/ 14 мая 2010

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

17 голосов
/ 14 мая 2010

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

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

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

1 голос
/ 18 декабря 2012

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

Я нашел решение моей проблемы здесь: Исправлена ​​ошибка, при которой функция перетаскивания не работала в Windows 7 Vista XP

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

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

1 голос
/ 27 октября 2010

Незначительное дополнение к посту 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 может не использовать обмен сообщениями Windows. Так что это никак не повлияет.

1 голос
/ 09 сентября 2010

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

ChangeWindowMessageFilter (WM_DROPFILES, MSGFLT_ADD);
ChangeWindowMessageFilter (WM_COPYDATA, MSGFLT_ADD);
ChangeWindowMessageFilter (0x0049, MSGFLT_ADD);
0 голосов
/ 15 сентября 2017

У меня возникла та же проблема при отладке приложения C # для настольных компьютеров в VS 2015 и Windows 7 x64, что и в S.O. Это произошло из-за разрешения администратора , примененного к ярлыку VS IDE на рабочем столе (см. Скриншот). Если снять этот флажок, события перетаскивания будут правильно отображаться.

Спасибо ТимЛлойду за помощь.

enter image description here

...