Поделиться через


Передача объектов оболочки с помощью перетаскивания и буфера обмена

Многие приложения позволяют пользователям передавать данные в другое приложение путем перетаскивания данных с помощью мыши или с помощью буфера обмена. Среди многих типов данных, которые можно передать, являются объекты оболочки, такие как файлы или папки. Передача данных оболочки может происходить между двумя приложениями, но пользователи также могут передавать данные оболочки в рабочий стол или проводник Windows.

Хотя файлы являются наиболее часто передаваемыми объектами Shell, передача данных оболочки может включать любой из различных объектов, найденных в пространстве имен Shell . Например, приложению может потребоваться перенести файл в виртуальную папку, например корзину, или принять объект из расширения пространства имен, отличного от Майкрософт. Если вы реализуете расширение пространства имен, он должен правильно вести себя как источник и целевой объект.

В этом документе описывается, как приложения могут реализовать передачу данных методом перетаскивания и через Буфер обмена с объектами Оболочки.

Как перетаскивание работает с объектами оболочки

Приложениям часто требуется предоставить пользователям способ передачи данных оболочки. Ниже приведены некоторые примеры.

  • Перетаскивание файла из Проводника Windows или с рабочего стола и помещение его в приложение.
  • Копирование файла в буфер обмена в проводнике Windows и вставка его в приложение.
  • Перетаскивание файла из приложения в корзину.

Подробные сведения об обработке этих и других сценариев см. в разделе Обработка сценариев передачи данных оболочки. В этом документе рассматриваются общие принципы передачи данных в системе Shell.

Windows предоставляет два стандартных способа передачи данных оболочки приложениям:

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

В обоих случаях передаваемые данные содержатся в объекте данных. Объекты данных — это объекты com-модели компонентов, предоставляющие интерфейс IDataObject. Схематично, существуют три основных шага, которых должны придерживаться все передачи данных Shell.

  1. Источник создает объект данных, представляющий передаваемые данные.
  2. Целевой объект получает указатель на интерфейс объекта данных IDataObject.
  3. Целевой объект вызывает интерфейс IDataObject для извлечения данных из него.

Разница между передачей данных через буфер обмена и методом перетаскивания заключается главным образом в том, как указатель IDataObject передается от источника к цели.

Передача данных буфера обмена

Буфер обмена — это самый простой способ передачи данных командной оболочки. Базовая процедура аналогична стандартной передаче данных буфера обмена. Тем не менее, так как вы передаете указатель на объект данных, а не сами данные, необходимо использовать API буфера обмена OLE вместо стандартного API буфера обмена. В следующей процедуре описывается использование API буфера обмена OLE для передачи данных оболочки с помощью буфера обмена:

  1. Источник данных создает объект данных для хранения данных.
  2. Источник данных вызывает OleSetClipboard, который помещает указатель на интерфейс объекта данных IDataObject в буфере обмена.
  3. Цель вызывает OleGetClipboard для получения указателя на интерфейс IDataObject объекта данных.
  4. Целевой объект извлекает данные, вызвав метод IDataObject::GetData.
  5. При некоторых передачах данных в Shell целевой объект может также вызвать метод IDataObject::SetData, чтобы предоставить сигнал объекту данных о результатах передачи данных. См. Обработка оптимизированных операций перемещения для примера этой операции.

Перенос данных методом перетаскивания и вставки

Хотя реализация немного сложнее, передача данных с использованием перетаскивания имеет некоторые значительные преимущества перед буфером обмена.

  • Перетаскивание можно выполнить с помощью простого перемещения мыши, что делает операцию более гибкой и интуитивно понятной, чем Буфер обмена.
  • Перетаскивание предоставляет пользователю визуальное отображение операции. Пользователь может следовать значку, перемещая его из источника в целевой объект.
  • Функция перетаскивания уведомляет целевой объект, когда данные становятся доступными.

Операции перетаскивания также используют объекты данных для передачи данных. Однако источник перетаскивания должен обеспечивать функциональность, помимо той, которая необходима для передачи буфера обмена.

  • Источник перетаскивания также должен создать объект, предоставляющий интерфейс IDropSource. Система использует IDropSource для взаимодействия с источником во время выполнения операции.
  • Объект данных перетаскивания отвечает за отслеживание перемещения курсора и отображение значка для представления объекта данных.

Целевые области для перетаскивания также должны обеспечивать более функциональные возможности, чем требуется для обработки передачи буфера обмена.

  • Целевой объект перетаскивания должен предоставлять интерфейс IDropTarget. Когда курсор находится в целевом окне, система использует IDropTarget, чтобы предоставить целевому объекту сведения, такие как положение курсора, и уведомить его, когда данные сброшены.
  • Целевой объект удаления должен зарегистрировать себя в системе, вызвав RegisterDragDrop. Эта функция предоставляет системе дескриптор целевого окна и указатель на интерфейс IDropTarget целевого приложения.

Заметка

Для операций перетаскивания приложение должно инициализировать COM с помощью OleInitialize, а не CoInitialize.

 

Во следующей процедуре описаны основные шаги, которые обычно используются для передачи данных Shell с использованием перетаскивания:

  1. Объект вызывает RegisterDragDrop, чтобы предоставить системе указатель на его интерфейс IDropTarget и зарегистрировать окно в качестве целевого объекта для перетаскивания.
  2. Когда пользователь запускает операцию перетаскивания, источник создает объект данных и инициирует цикл перетаскивания путем вызова DoDragDrop.
  3. Когда курсор находится в целевом окне, система уведомляет целевой объект путем вызова одного из методов IDropTarget целевого объекта. Система вызывает IDropTarget::DragEnter, когда курсор входит в целевое окно, и IDropTarget::DragOver, когда курсор перемещается над целевым окном. Оба метода предоставляют целевой объект удаления с текущей позицией курсора и состоянием клавиш-модификаторов клавиатуры, таких как CTRL или ALT. Когда курсор покидает целевое окно, система уведомляет целевое окно путем вызова IDropTarget::DragLeave. При возврате любого из этих методов система вызывает интерфейс IDropSource для передачи возвращаемого значения источнику.
  4. Когда пользователь отпускает кнопку мыши, чтобы сбросить данные, система вызывает метод IDropTarget::Drop. Среди параметров метода является указатель на интерфейс объекта данных IDataObject.
  5. Целевой объект вызывает метод IDataObject::GetData для извлечения данных.
  6. При передаче данных оболочки целевой объект может также вызвать метод IDataObject::SetData, чтобы предоставить информацию источнику о результатах передачи данных.
  7. Когда целевой объект завершится с объектом данных, он возвращается из IDropTarget::D rop. Система возвращает вызов DoDragDrop источника, чтобы уведомить источник о завершении передачи данных.
  8. В зависимости от конкретного сценария передачи данныхисточник может потребоваться выполнить дополнительные действия на основе значения, возвращаемого DoDragDrop, и значений, передаваемых объекту данных целевым объектом. Например, при перемещении файла источник должен проверить эти значения, чтобы определить, нужно ли удалить исходный файл.
  9. Источник освобождает объект данных.

Хотя описанные выше процедуры предоставляют хорошую общую модель для передачи данных Shell, существует множество различных типов данных, которые могут содержаться в объекте данных Shell. Существует также ряд различных сценариев передачи данных, которые может потребоваться обрабатывать приложение. Для каждого типа данных и сценария требуется несколько другой подход к трем ключевым шагам в процедуре:

  • Как источник создает объект данных для хранения данных оболочки.
  • Как целевой объект извлекает данные Shell из объекта данных.
  • Как источник завершает операцию передачи данных.

Объект данных оболочки предоставляет общие сведения о том, как источник создает объект данных Оболочки и как этот объект данных может обрабатываться целевым объектом. Обработка сценариев передачи данных оболочки подробно описывает, как обрабатывать ряд распространенных сценариев передачи данных оболочки.