Как создать расширение оболочки Info tip

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

В библиотеке Shell Ace обработчик InfoTip реализует следующие интерфейсы:

После создания проекта расширения необходимо добавить в проект модуль с обработчиком Info tip. Для этого выберите соответствующую иконку на вкладке Shell extension:

Создание обработчика info tip

Появится окно с предложением ввести имя класса и выбрать перекрываемые методы:

Методы обработчика info tip

После нажатия на кнопку 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 флагОписание
itfLinkNoTargetQITIPF_LINKNOTARGETЕсли обрабатываемый файл является ссылкой, то текст всплывающей подсказки должен относится к самой ссылке.
itfLinkUseTargetQITIPF_LINKUSETARGETЕсли обрабатываемый файл является ссылкой, то текст всплывающей подсказки должен относится к файлу, на который ссылается ссылка.
itfLinkNoTargetQITIPF_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 являются следующие методы:

Смотрите также: