Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОСиСП - методички / OS&SP_Lab_2.6(shell).doc
Скачиваний:
95
Добавлен:
18.05.2015
Размер:
1.12 Mб
Скачать

Регистрация расширения оболочки

Регистрация нашего "вьювера битмапов" делается так же, как и других расширений контекстных меню. Вот RGS сценарий для этой работы:

HKCR

{

NoRemove Paint.Picture

{

NoRemove ShellEx

{

NoRemove ContextMenuHandlers

{

BitmapPreview = s '{D6F469CD-3DC7-408F-BB5F-74A1CA2647C9}'

}

}

}

}

Заметьте, что тип файлов "Paint.Picture" здесь жестко закодирован. Если вы не используете Paint, как вьювер по умолчанию для BMP-файлов, то вам необходимо изменить "Paint.Picture" на то, что указано в значении по умолчанию в ключе HKCR\.bmp.

Расширение 2 - Обработка щелчка правой кнопкой мыши на фоне окна каталога.

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

Параметры в IShellExtInit::Initialize() использованы иначе. Расширение регистрируется под другим ключом.

Отличия в iShellExtInit::Initialize()

Метод Initialize() имеет параметр pidlFolder, который до этого времени мы игнорировали, потому что он был NULL. Сейчас, наконец-то, этот параметр пригодится! Это PIDL каталога, где произошел щелчок правой кнопкой мыши. Второй параметр (IDataObject*) - NULL, потому что не было выбрано ни одного файла.

Вот реализация Initialize():

STDMETHODIMP CBkgndCtxMenuExt::Initialize (

LPCITEMIDLIST pidlFolder,

LPDATAOBJECT pDO,

HKEY hkeyProgID )

{

// pidlFolder - PIDL каталога, на котором был щелчок. pDO -

// NULL, т.к. не было указано с чем работать.

// Мы получаем обычный путь к каталогу из его PIDL с помощью

// SHGetPathFromIDList() API.

return SHGetPathFromIDList ( pidlFolder, m_szDirClickedIn ) ? S_OK : E_INVALIDARG;

}

Функция SHGetPathFromIDList() получает полный путь папки, который мы сохраняем для дальнейшего использования. Возвращаемое этой функцией BOOL-значение используется для индикации успеха или неудачи операции.

Отличия в регистрации.

Этот тип расширений регистрируется под другим ключом - а именно HKCR\Directory\Background\ShellEx\ContextMenuHandlers. Вот RGS сценарий для регистрации:

HKCR

{

NoRemove Directory

{

NoRemove Background

{

NoRemove ShellEx

{

NoRemove ContextMenuHandlers

{

ForceRemove SimpleBkgndExtension = s '{9E5E1445-6CEA-4761-8E45-AA19F654571E}'

}

}

}

}

}

За исключением этих двух отличий, расширение работает также, как и другие расширения контекстного меню. Хотя все же есть одна ловушка в IContextMenu::QueryContextMenu(). Похоже параметр uIndex всегда равен -1 (0xFFFFFFFF). Передача -1 в качестве индекса в InsertMenu() означает, что новый пункт будет расположен в самом низу меню. Однако, если вы инкрементируете uIndex, он переполнится и станет равным нулю, означая, что если вы снова передадите uIndex в InsertMenu(), то второй пункт появится в самом верху меню. Посмотрите в демонстрационном проекте код для QueryContextMenu() чтобы видеть, как правильно добавить пункты меню на нужное место.

Вот как выглядит модифицированное контекстное меню, с двумя добавленными пунктами в конце. Отмечу, что, IMHO, добавление пунктов в конец меню таким образом имеет значительные проблемы в удобстве использования. Предположим, пользователь хочет указать пункт "Properties". Обычные действия в этом случае - это щелчок правой кнопкой мыши и затем выбор последнего пункта меню. Когда появляется наше расширение и добавляет пункты после "Properties", мы заставляем привычку пользователя работать неправильно, что может причинить расстройство и вызвать несколько неприятных email-ов. ;)

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

Соседние файлы в папке ОСиСП - методички