Как создать расширение оболочки Info tip
Обработчик Info tip позволяет определить текст всплывающей подсказки, появляющейся при наведении указателя мыши на файловый объект в Проводнике. Также этот обработчик используется при выводе информации о файле в диалоге подтверждения удаления файла.
В библиотеке Shell Ace обработчик InfoTip реализует следующие интерфейсы:
- IQueryInfo
- IInitializeWithStream
- IInitializeWithItem
- IInitializeWithFile
- IPersistStream
- IParentAndItem
- IPersistFile
После создания проекта расширения необходимо добавить в проект модуль с обработчиком Info tip. Для этого выберите соответствующую иконку на вкладке Shell extension:
Появится окно с предложением ввести имя класса и выбрать перекрываемые методы:
После нажатия на кнопку OK в проект будет добавлен модуль с каркасом обработчика. При включении опции Create sample помимо каркаса обработчика будут создан пример готового расширения оболочки, который можно использовать для изучения библиотеки. Рекомендуется перекрывать метод CreateInfoTipFromStream, поскольку это даст возможность Проводнику передавать в расширение не только реальные объекты файловой системы, но и виртуальные объекты, например файл из zip архива.
В обработчике можно перекрывать следующие виртуальные процедуры и функции:
procedure Initialize;
Процедура инициализации обработчика, вызывается один раз при создании экземпляра обработчика.
procedure Clear;
Процедура вызывается при завершении работы с текущим файлом или потоком, переданным в обработчик.
class function GetClassID: TCLSID;
Функция должна возвращать уникальный идентификатор обработчика. Библиотека Shell Ace изначально генерирует уникальный идентификатор при генерации шаблона обработчика, поэтому менять его нет необходимости.
class function GetDescription: UnicodeString;
Функция должна возвращать описание обработчика.
procedure FillProgIDList(AList: TStrings);
В процедуре должно происходить заполнение списка AList ключами реестра, в которые будет прописан обработчик при регистрации расширения. Регистрация происходит в раздел реестра HKEY_CLASSES_ROOT. Например, если будет добавлен ключ .bmp, то расширение будет прописано в ветку HKEY_CLASSES_ROOT\.bmp\ShellEx\{00021500-0000-0000-C000-000000000046} и будет соответствовать всем файлам, имеющим расширение bmp, а если будет добавлен ключ SystemFileAssociations\Audio, то расширение будет прописано в ветку HKEY_CLASSES_ROOT\SystemFileAssociations\Audio\ShellEx\{00021500-0000-0000-C000-000000000046} и будет соответствовать всем файлам, расширения которых имеют PerceivedType Audio.
При добавлении ключа реестра нужно учитывать, что в Windows определен порядок приоритета обработчиков. И если в системе зарегистрирован обработчик с более высоким приоритетом, то ваш обработчик не будет вызываться.
Порядок приоритета типов объектов, в порядке уменьшения приоритета, может отличаться в различных версиях Windows:
Ключ реестра | Примечание |
---|---|
HKCR\ProgID | Если для расширения файла определено значение Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.Расширение\UserChoice |
HKCR\ProgID | Если для расширения файла определено значение ProgID |
HKCR\.Расширение | Расширение файла |
HKCR\SystemFileAssociations\.Расширение | Системное расширение файла |
HKCR\SystemFileAssociations\PerceivedType | Если для расширения файла определено значение PerceivedType |
HKCR\Kind.Kind | Если для расширения файла определено значение Kind |
HKCR\Unknown | Файл, не имеющий описанного в реестре расширения |
HKCR\* | Любой файл |
В общем случае рекомендуется регистрировать расширение на ProgID расширения файла.
function CreateInfoTipFromStream(AStream: TStream; AOpenMode: DWORD; AFlags: TdecInfoTipFlags): UnicodeString;
Функция должна на основании потока с данными AStream сформировать текст всплывающей подсказки, вызывается в реализации метода GetInfoTip интерфейса IQueryInfo. Текст может быть многострочным. Все ведущие и завершающие пробелы в тексте будут автоматически удалены, также будут автоматически удалены все пустые строки.
Параметр OpenMode определяет режим работы с потоком. Он может быть равен следующим величинам:
- STGM_READ – поток может быть использован только для чтения
- STGM_READWRITE – поток может быть использован как для чтения, так и для записи.
Для формирования текста можно дополнительно анализировать флаги AFlags. Тип TdecInfoTipFlags определен следующим образом:
TdecInfoTipFlag = (itfLinkNoTarget, itfLinkUseTarget, itfUseSlowTip);
TdecInfoTipFlags = set of TdecInfoTipFlag;
Каждый из элементов множества соответствует одному из флагов, переданных в метод GetInfoTip интерфейса IQueryInfo.
Значение | WinAPI флаг | Описание |
---|---|---|
itfLinkNoTarget | QITIPF_LINKNOTARGET | Если обрабатываемый файл является ссылкой, то текст всплывающей подсказки должен относится к самой ссылке. |
itfLinkUseTarget | QITIPF_LINKUSETARGET | Если обрабатываемый файл является ссылкой, то текст всплывающей подсказки должен относится к файлу, на который ссылается ссылка. |
itfLinkNoTarget | QITIPF_USESLOWTIP | Оболочка уведомляет расширение о том, что расширению можно использовать долго выполняющиеся операции для создания текста всплывающей подсказки, например, чтение данных по локальной сети. |
Флаги QITIPF_USENAME и QITIPF_SINGLELINE библиотека Shell Ace обрабатывает самостоятельно.
function CreateInfoTipFromFileName(const AFileName: UnicodeString; AOpenMode: DWORD; AFlags: TdecInfoTipFlags): UnicodeString;
Метод аналогичен методу CreateInfoTipFromStream за исключением того, что вместо потока передается имя файла. Для создания потока для чтения данных из файла можно воспользоваться следующей функцией:
function CreateStream(const AFileName: UnicodeString; AOpenMode: DWORD = DefaultOpenMode): TStream;
После использования полученного потока его нужно удалить.
В данной функции можно воспользоваться двумя дополнительными экспериментальными функциями:
function CreatePreviousInfoTip(AFlags: TdecInfoTipFlags): UnicodeString;
Функция возвратит результат работы обработчика Info tip, имеющего приоритет на один меньше, чем приоритет текущего обработчика. Это может быть удобно, если нужно добавить лишь пару строк к стандартной информации о файле.
function CreateInfoTipFromProperties(AInfoTip: UnicodeString; AEnableSlow: Boolean): UnicodeString;
Функция возвратит строку, сформированную на основе свойств файла. Необходимые свойства файла запрашиваются в параметре AInfoTip в формате prop:name1;name2;name3, например, prop:System.ItemTypeText;System.Size;System.DateModified
Обязательными для реализации в обработчике Info tip являются следующие методы:
- GetClassID
- FillProgIDList
- CreateInfoTipFromStream или CreateInfoTipFromFileName
Смотрите также:
- Что такое расширение оболочки
- Какие бывают расширения оболочки
- Как создать расширение оболочки
- Инициализация расширений оболочки
- Как создать расширение оболочки Context menu
- Как создать расширение оболочки Drag and drop context menu
- Как создать расширение оболочки Drop target
- Как создать расширение оболочки Icon
- Как создать расширение оболочки Info tip
- Как создать расширение оболочки Overlay icon
- Как создать расширение оболочки Preview
- Как создать расширение оболочки Property sheet
- Как создать расширение оболочки Property store
- Как создать расширение оболочки Thumbnail
- Как зарегистрировать расширение оболочки
- Как отлаживать расширение оболочки
- Использование логов