Добавление значков, предварительных просмотров и контекстных меню
Чтобы ваши данные корректно индексировались и представлялись пользователю во время поиска, необходимо реализовать хранилища данных оболочки (также известные как расширения пространства имен оболочки ) и обработчики типов файлов (также известные как расширения оболочки, обработчики расширений или обработчики расширений оболочки).
В этом разделе описаны следующие интерфейсы:
Реализация обработчиков типов файлов
Эти расширения оболочки или обработчики типов файлов предоставляют пользователям следующие возможности оболочки:
- В представлении результатов отображается определенный значок для типа элемента.
- В представлении результатов отображается предварительный просмотр элемента, когда пользователь выбирает элемент.
- Пользователи могут дважды щелкнуть элементы, чтобы инициировать такие события, как открытие файла.
- Пользователи могут щелкнуть правой кнопкой мыши элементы для доступа к контекстной (контекстной) меню.
- Пользователи могут перетаскивать элементы.
Как и все объекты объектной модели компонентов (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.
Чтобы создать настраиваемый обработчик предварительной версии, выполните приведенные действия.
Реализуйте IPreviewHandler, принимающего IStream, следуя рекомендациям, приведенным в Предварительные обработчики.
Зарегистрируйте обработчик предварительной версии:
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>}
Выполните следующие два шага, чтобы создать папку оболочки для URL-адреса:
В методе 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);
Когда оболочка запрашивает папку Оболочки для потока данных, чтобы инициализировать обработчик предварительного просмотра, перейдите к методу IShellFolder::BindToObject метод, обработайте IID_IStream и верните IStream URL-адресу.
Чтобы повторно использовать существующий обработчик предварительной версии для типа файла, выполните следующие два действия:
- Зарегистрируйте этот предварительный обработчик для типа файла, используя CLSID существующего предварительного обработчика вместо <Your_PreviewHandler_GUID>.
- Реализуйте папку Shell.
Для получения дополнительной информации о создании обработчиков предварительного просмотра см. в IPreviewHandler и Preview Handlers.
Дополнительные ресурсы
- Чтобы получить обзор процесса индексирования, см. Процесс индексирования.
- Сведения о создании обработчиков см. в разделе Регистрация расширений оболочки, Создание обработчиков расширений оболочки, Контекстное меню, Расширения пространства имен оболочки и Предварительные обработчики.
Связанные разделы
-
концептуальные
-
пример кода : расширения оболочки для обработчиков протоколов