Ole drag & amp; устранение неисправностей

Я создал диалог с использованием 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;

И это все. Раньше Оле действительно не пользовался, поэтому я попробовал следующие сценарии в поисках удачи:

  1. Я зарегистрировался в RegisterDragDrop для HWND элемента управления List и установил родительский диалог для получения уведомления. WM_OLEDROP WM_USER + 1 что я отправляю. Хорошо, курсор для перетаскивания & Дроп показал, но вызовов для реализации функций IDataTarget не было.

  2. RegisterDragDrop для детского общения & уведомления для этого также.

  3. RegisterDragDrop для основного диалога & уведомления для этого также.

В более поздних случаях (2 & 3) курсор для перетаскивания& падение даже не появилось, оно показало мне отсутствие сопротивления & падение позволило одному.
Теперь все диалоги и управление списком были настроены на прием файлов от дизайнера Visual Studio.
Я ограничен использованием только ATL / WTL / WINAPI, без MFC.
Что я делаю неправильно?

1

Решение

Для тебя 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).

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]