- •Методические указания для выполнения лабораторной работы №2.6 по курсу «Операционные системы и системное программирование»
- •Цель работы
- •Теоретические сведения
- •Пример 1 «Добавление пунктов в контекстное меню для отдельных расширений файлов»
- •Использование AppWizard.
- •Интерфейс инициализации
- •Интерфейс взаимодействия с контекстным меню
- •Модификация контекстного меню
- •Отображение подсказки в строке состояния
- •Выполнение выбора пользователя
- •Регистрация расширения оболочки
- •Отладка расширения оболочки
- •Результат
- •Пример 2 «Добавление пунктов в контекстное меню для всех файлов не зависимо от расширения»
- •Дополнительные функции расширения, добавляющего пункты к контекстному меню оболочки.
- •Использование AppWizard
- •Интерфейс инициализации
- •Добавление пунктов к меню
- •Подсказка в строке состояния и "действие"
- •Выполнение выбора пользователя
- •Регистрация расширения
- •Результат
- •Другие способы регистрации расширения
- •Пример 3 «Использование разделяемой с оболочкой памяти»
- •Расширение QueryInfo
- •Использование AppWizard
- •Интерфейс инициализации
- •Создание текста для тултипа
- •Регистрация расширения оболочки
- •Пример 4 «Обработчик перетаскивания контекстного меню»
- •Обработчик перетаскивания
- •Интерфейс инициализации
- •Модификация контекстного меню
- •Создание связи
- •Обеспечение подсказки в строке состояния
- •Создание связи
- •Регистрация расширения
- •Пример 5 «Добавления новых страниц в набор свойств файлов»
- •Обработчик набора свойств
- •Использование AppWizard
- •Интерфейс инициализации
- •Добавление страниц свойств
- •Неприятная ситуация с периодом жизни объектов
- •Функции обратного вызова страницы свойств
- •Обработчики сообщений страницы свойств
- •Регистрация расширения
- •Пример 6 «Обработчик сбрасывания в меню Send To»
- •Обработчик сбрасывания
- •Использование AppWizard
- •Интерфейс инициализации
- •Участвуем в операции drag and drop
- •DragEnter()
- •DragLeave()
- •Регистрация расширения
- •Пример 7 «Owner-drawn меню в расширениях контекстных меню и по созданию расширения контекстного меню, которое отзывается на правый щелчок на фоне окна каталога» Расширение 1 - Пункты меню owner-drawn.
- •Использование AppWizard
- •Интерфейс инициализации.
- •Взаимодействие с контекстным меню
- •Модифицирование контекстного меню.
- •Отображение всплывающей подсказки в строке состояния.
- •Выполнение выбора пользователя.
- •Рисование пункта меню.
- •Обработка wm_measureitem
- •Обработка wm_drawitem
- •Регистрация расширения оболочки
- •Расширение 2 - Обработка щелчка правой кнопкой мыши на фоне окна каталога.
- •Отличия в iShellExtInit::Initialize()
- •Отличия в регистрации.
- •Пример 8 «Добавление колонки в окно детального просмотра Проводника» Детальный просмотр в Windows 2000
- •Использование AppWizard
- •Интерфейс расширения
- •Инициализация
- •Перечисление новых столбцов
- •Отображение данных в столбцах
- •Небольшое отступление - обработка тэгов id3
- •Как это все выглядит?
- •Регистрация расширения оболочки
- •Еще одна полезная штучка - InfoTips
- •Пример 9 «Настройка иконок, отображаемых для файлов заданного типа» Файловые иконки в Проводнике
- •Использование AppWizard
- •Интерфейс расширения
- •Интерфейс инициализации
- •Интерфейс iExtractIcon
- •Извлечение методом 1
- •Извлечение методом 2
- •Регистрация расширения
- •Пример 10 «Расширение оболочки для изменения иконок у dll в зависимости от их типа»
- •Как установить
- •Подробности реализации
- •Задания для лабораторных работ
- •Содержание отчета
Регистрация расширения
Это расширение может работать с файлами любых типов, поэтому мы регистрируем его под ключом HKEY_CLASSES_ROOT\*. Вот сценарий регистрации расширения:
|
HKCR { NoRemove * { NoRemove shellex { NoRemove PropertySheetHandlers { {3FCEF010-09A4-11D4-8D3B-D12F9D3D8B02} } } } } |
Вы могли заметить, что GUID расширения сохранен здесь как имя ключа регистрации вместо строкового значения. Документация и книги, которые я просматривал, противоречат друг другу по поводу правильного обозначения, хотя во время моего беглого испытания оба варианта работали. Я решил идти по пути Dino Esposito ("Visual C++ Windows Shell Programming") и поместил GUID как имя ключа.
Пример 6 «Обработчик сбрасывания в меню Send To»
В этом примере показан тип расширения оболочки, который используется достаточно редко - обработчиком сбрасывания. Этот тип расширения может быть использован для добавления функции "перетащить и сбросить" к проводнику. При этом файл, на который осуществляется сбрасывание, определяет используемое расширение.
Обработчик сбрасывания
В примере 4обработчик перетаскивания, который загружается во время операции перетаскивания с помощью правой кнопки мыши. Проводник также позволяет нам написать расширение, которое будет загружаться при перетаскивании файлов левой кнопкой мыши. В этой операции расширение оперирует файлом, на который осуществляется сбрасывание. Например, WinZip содержит обработчик сбрасывания, который позволяет добавить файлы к архиву просто сбрасывая их на архив. Когда вы проносите файл над zip-архивом, проводник показывает, что этот архив является целью для сбрасывания, подсвечивая zip-файл и добавляя к курсору знак «+»:
Если бы обработчика сбрасывания не было, при перемещении файла над архивом ничего бы не произошло:
Обработчики сбрасывания действительно полезны только тогда, когда у вас есть свой тип файлов, как у WinZip. Намного интереснее с помощью обработчика сбрасывания добавить пункты к меню Send To. Меню Send To показывает содержимое меню \Windows\SendTo (в NT путь отличается для каждого пользователя). Обычно каталог Send To содержит ярлычки, но Microsoft Power Toys добавляет несколько других пунктов, как показано ниже:
Если вы не понимаете, причем здесь обработчики, взгляните на листинг каталога Send To:
|
12-02-98 0:27 129 3? Floppy (A).lnk 11-26-98 10:27 0 Any Folder....OtherFolder 11-26-98 10:27 0 Clipboard as Contents.ContentsOnClipboard 11-26-98 10:27 0 Clipboard as Name.NameOnClipboard 11-26-98 10:27 0 Command Line.CommandLine 03-26-99 8:42 0 Desktop (create shortcut).DeskLink 04-22-99 23:30 0 Norton Wipe Slack Space.WipeSlack 04-22-99 23:30 0 Norton WipeInfo.WipeInfo 11-26-98 10:26 285 Notepad.lnk 01-07-00 9:01 212 xfer directory on zip drive.lnk |
Обратите внимание на странные расширения типа ".ContentsOnClipboard". Эти пустые файлы появятся как пункты в меню Send To, а их расширения прописаны в реестре. Это не обычные ассоциации, т.к. этим файлам не поставлены в соответствие действия типа «Открыть» или «Печатать». Их работа - обработка сбрасываний. Когда вы выбираете один из этих пунктов в меню Send To, проводник загружает соответствующий обработчик сбрасывания. Вот другой вид меню с выделенными обработчиками сбрасывания:
Демонстрационный проект этой статьи будет аналогом Send To Any Folder Powertoy - он скопирует или переместит файлы в любой каталог вашей системы.
