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


Добавление значков, предварительных просмотров и контекстных меню

Чтобы ваши данные корректно индексировались и представлялись пользователю во время поиска, необходимо реализовать хранилища данных оболочки (также известные как расширения пространства имен оболочки ) и обработчики типов файлов (также известные как расширения оболочки, обработчики расширений или обработчики расширений оболочки).

В этом разделе описаны следующие интерфейсы:

Реализация обработчиков типов файлов

Эти расширения оболочки или обработчики типов файлов предоставляют пользователям следующие возможности оболочки:

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

Как и все объекты объектной модели компонентов (COM), обработчики типов файлов должны реализовать интерфейс IUnknown и фабрику классов.

В Windows XP или более ранних версиях обработчики также должны реализовать:

В Windows Vista интерфейс IPersistFile и интерфейс IShellExtInit были заменены следующими тремя интерфейсами для системы Shell, чтобы инициализировать обработчик:

Чтобы обеспечить разумный пользовательский опыт, необходимо предоставить обработчику протокола хранилище данных Shell. Затем это хранилище данных служит фабрикой для обработчиков значков, обработчиков контекстного меню, обработчиков предварительного просмотра и т. д. Минимальные реализации интерфейса IPersist и интерфейса IPersistFolder требуются Интерфейс IShellFolder, а для IContextMen u и IExtractIconтребуется минимальная реализация интерфейса IShellFolder.

Заметка

Для IPersistследует реализовать тот же идентификатор класса (CLSID), IPersistFolder и IShellFolder.

 

Дополнительные сведения о создании хранилища данных оболочки для поддержки обработчика протокола см. в разделе Реализация базовых интерфейсов объектов папок.

IPersist

Интерфейс IPersist определяет единый метод GetClassID, который предназначен для предоставления CLSID объекта, который может храниться постоянно в системе.

Метод Описание
GetClassID Возвращает CLSID объекта хранилища данных Shell

 

IPersistFolder

Интерфейс IPersistFolder используется для инициализации объектов папок Shell. Реализация этого интерфейса, который является производным от IPersist, сообщает папке, где она находится в пространстве имен в оболочке. Вы не используете этот интерфейс напрямую. Метод IShellFolder::BindToObject используется реализацией файловой системы при инициализации объекта папки Shell.

Метод Описание
Инициализировать Указывает объекту папки Shell инициализировать себя на основе переданных сведений и возвращает S_OK

 

IShellFolder

Интерфейс IShellFolder используется для управления папками, и требуется частичная реализация, чтобы интерфейсы значка и контекста, реализованные для обработчика протокола, правильно себя вели в пользовательском интерфейсе результатов поиска Windows. Большая часть необходимых функций предоставляется с помощью метода getUIObjectOf . Этот метод позволяет надстройке запрашивать интерфейсы IExtractIcon и IContextMenu.

Интерфейс IShellFolder использует ПИДЛы вместо URL-адресов. В отличие от требований полного хранилища данных Shell надстройки могут использовать простую структуру IDL, содержащую только URL-адрес.

Необходимо реализовать следующие методы интерфейса IShellFolder. Пять из этих методов требуют минимальной реализации.

Метод Описание
BindToObject Возвращает E_NOTIMPL
BindToStorage Возвращает E_NOTIMPL
CreateViewObject Возвращает E_NOTIMPL
SetNameOf Возвращает E_NOTIMPL
ParseDisplayName Преобразует URL-адрес в структуру PIDL
CompareIDs Сравнивает два значения PIDL
GetDisplayNameOf Возвращает URL-адрес для PIDL
GetUIObjectOf Этот метод аналогичен методу IUnknown::QueryInterface. Если запрашивается значок, вызывающий запрашивает IID_IExtractIcon; Если запрашивается контекстное меню, вызывающий запрашивает IID_IContextMenu

 

IShellFolder не используется для перечисления папок. Это означает, что отображаемое имя папки будет физическим URL-адресом. Это может измениться в будущем.

IContextMenu

Когда поиск Windows отображает результаты пользователю, пользователь может щелкнуть элемент правой кнопкой мыши и просмотреть контекстное меню, определенное интерфейсом IContextMenu. Меню быстрого доступа также называются контекстными меню.

Действие по умолчанию в контекстном меню является тем же действием, что и при двойном щелчке элемента. Без соответствующих интерфейсов IShellFolder или IContextMenu, поведение по умолчанию для события двойного щелчка — передача URL-адреса в качестве аргумента функции ShellExecute.

Подробнее о создании обработчиков контекстного меню см. в разделе "Создание обработчиков контекстного меню", а пример кода см. в разделе "Пример: расширения оболочки для обработчиков протоколов".

IExtractIcon

IExtractIcon получает значок интерфейса пользователя поиска Windows на основе URL-адреса в PIDL, предоставленном вашим обработчиком протокола.

Обратитесь к Создание обработчиков значков для получения дополнительной информации о создании обработчиков значков и к Пример: расширения оболочки для обработчиков протоколов для примера кода.

IPreviewHandler

IPreviewHandler отображает широкий предварительный просмотр выбранного элемента в проводнике Windows. Предварительные версии доступны в Windows Search 4.0 или в Windows Vista с помощью windows Desktop Search 3.x.

Чтобы создать настраиваемый обработчик предварительной версии, выполните приведенные действия.

  1. Реализуйте IPreviewHandler, принимающего IStream, следуя рекомендациям, приведенным в Предварительные обработчики.

  2. Зарегистрируйте обработчик предварительной версии:

    HKEY_CLASSES_ROOT\<Your_Object_Type>
    
    HKEY_CLASSES_ROOT\<Your_Object_Type>\ShellEx
    
    HKEY_CLASSES_ROOT\<Your_Object_Type>\ShellEx\{8895b1c6-b41f-4c1c-a562-0d564250836f}
       @ = {<Your_PreviewHandler_GUID>}
    
  3. Выполните следующие два шага, чтобы создать папку оболочки для URL-адреса:

    1. В методе IShellFolder::GetUIObjectOfобработайте IQueryAssociations и верните связь для элементов оболочки, как показано в следующем примере кода.

      CComPtr<IQueryAssociations> spqa;
      AssocCreate(CLSID_QueryAssociations, __uuidof(IQueryAssociations), &spqa);
      spqa->Init(0, L"Your_Object_Type", NULL, NULL);
      spqa->QueryInterface(riid, ppvReturn);
      
    2. Когда оболочка запрашивает папку Оболочки для потока данных, чтобы инициализировать обработчик предварительного просмотра, перейдите к методу IShellFolder::BindToObject метод, обработайте IID_IStream и верните IStream URL-адресу.

Чтобы повторно использовать существующий обработчик предварительной версии для типа файла, выполните следующие два действия:

  1. Зарегистрируйте этот предварительный обработчик для типа файла, используя CLSID существующего предварительного обработчика вместо <Your_PreviewHandler_GUID>.
  2. Реализуйте папку Shell.

Для получения дополнительной информации о создании обработчиков предварительного просмотра см. в IPreviewHandler и Preview Handlers.

Дополнительные ресурсы

концептуальные

разработка обработчиков протоколов

Основные сведения о обработчиках протоколов

уведомление об изменениях в индексе

пример кода : расширения оболочки для обработчиков протоколов

установка и регистрация обработчиков протоколов

Разработка поискового соединителя для обработчика протокола

отладочные обработчики протоколов