Я создал диалог с использованием WTL, унаследованный от класса CDialogImpl, в главном диалоге я создал другой диалог, а во втором дочернем диалоге — элемент управления списком. Я хотел добавить перетаскивание& удалить функциональность в элемент управления списком, я читал в Интернете о методе WM_DROPFILES и о цели удаления Ole, я выбрал более поздний.
Я реализовал методы интерфейса IDropTarget в соответствии с этот.
Во всех моих диалогах я установил для опции accept files значение TRUE, я создал экземпляр IDropTarget в классе дочернего диалога и вызвал следующие методы в его обработчике WM_INITDIALOGUE:
//drag& drop
lpDropTarget = (LPDROPTARGET)new TDropTarget(m_hWnd);
CoLockObjectExternal(lpDropTarget, true, true);
// register the HWND as a drop target
RegisterDragDrop(m_hWnd, lpDropTarget);
lpDropTarget создается следующим образом:
LPDROPTARGET lpDropTarget;
И это все. Раньше Оле действительно не пользовался, поэтому я попробовал следующие сценарии в поисках удачи:
Я зарегистрировался в RegisterDragDrop для HWND элемента управления List и установил родительский диалог для получения уведомления. WM_OLEDROP WM_USER + 1
что я отправляю. Хорошо, курсор для перетаскивания & Дроп показал, но вызовов для реализации функций IDataTarget не было.
RegisterDragDrop для детского общения & уведомления для этого также.
RegisterDragDrop для основного диалога & уведомления для этого также.
В более поздних случаях (2 & 3) курсор для перетаскивания& падение даже не появилось, оно показало мне отсутствие сопротивления & падение позволило одному.
Теперь все диалоги и управление списком были настроены на прием файлов от дизайнера Visual Studio.
Я ограничен использованием только ATL / WTL / WINAPI, без MFC.
Что я делаю неправильно?
Для тебя WM_DROPFILES
это единственное, что вам нужно сделать. Не нужно возиться с IDropTarget
и т.п.
Если ваше приложение не нужно запускать в режиме администратора, не запускайте его в режиме администратора. Отключить настройку компоновщика для того же (UAC Execution Level = asInvoker
). Кроме того, запустите VS в режиме без прав администратора, чтобы приложение также запускалось без прав администратора. Таким образом, Explorer.exe сможет отправить WM_DROPFILES
сообщение в вашу заявку.
Если ваше приложение должно работать в режиме администратора, вам нужно разрешить другим приложениям отправлять несколько приложений в ваше приложение (окно). Сделайте следующее:
ChangeWindowMessageFilter(WM_DROPFILES, MSGFLT_ADD);
ChangeWindowMessageFilter(WM_COPYDATA, MSGFLT_ADD);
ChangeWindowMessageFilter(0x0049, MSGFLT_ADD);
Вы также можете использовать более новую функцию: ChangeWindowMessageFilterEx.
Обратите внимание, что если ваше приложение должно работать от имени администратора, и вам нужно динамически найти одну из этих функций, используя GetProcAddress
, так что ваше приложение может работать в ОС, где эта функция недоступна (например, Windows XP).
Других решений пока нет …