- •Методические указания для выполнения лабораторной работы №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 в зависимости от их типа»
- •Как установить
- •Подробности реализации
- •Задания для лабораторных работ
- •Содержание отчета
Регистрация расширения
Регистрация обработчика перетаскивания проще, чем других расширений - обработчиков контекстных меню. Все обработчики перетаскивания регистрируются под ключом HKCR\Directory, так как перетаскивание заканчивается в каком-либо каталоге. Однако, о чем не говорится в документации, так это о том, что регистрации под HKCR\Directory недостаточно, чтобы обработать все случаи. Вы должны зарегистрировать ваше расширение также под ключами HKCR\Folder, чтобы обрабатывать сбрасывания на рабочий стол (desktop) и HKCR\Drive, чтобы обрабатывать сбрасывания в корневой каталог.
Вот RGS скрипт, учитывающий все три вышеуказанных случая:
|
HKCR { NoRemove Directory { NoRemove shellex { NoRemove DragDropHandlers { ForceRemove HardLinkShlExt = s '{3C06DFAE-062F-11D4-8D3B-919D46C1CE19}' } } } NoRemove Folder { NoRemove shellex { NoRemove DragDropHandlers { ForceRemove HardLinkShlExt = s '{3C06DFAE-062F-11D4-8D3B-919D46C1CE19}' } } } NoRemove Drive { NoRemove shellex { NoRemove DragDropHandlers { ForceRemove HardLinkShlExt = s '{3C06DFAE-062F-11D4-8D3B-919D46C1CE19}' } } } } |
Пример 5 «Добавления новых страниц в набор свойств файлов»
В пятой части руководства мы осмелимся заглянуть в мир окон свойств. Когда Вы выводите свойства объектов файловой системы проводник показывает их на странице "Общие". Оболочка позволяет нам расширить окно набора свойств, используя тип расширения, который называется обработчиком набора свойств (property sheet handler).
Эта статья подразумевает, что у Вас есть основные знания по расширениям оболочки и Вы знакомы с классами-контейнерами STL. Если Вам необходимо освежить знания по STL, Вы должны прочитать часть II, так как те же методы будут использоваться в этой статье. Код использует несколько функций из shlwapi.dll версии 4.71, так что Вам нужен будет IE4 или выше (Active Desktop устанавливать не обязательно).
Обработчик набора свойств
Все знакомы с окнами свойств проводника. Точнее говоря, это набор свойств, который содержит одну или больше страниц. Каждый набор свойств имеет страницу "Общие", отображающую полный путь, дату модификации и другую информацию. Проводник позволяет нам добавить свои собственные страницы к набору свойств, используя расширение - обработчик набора свойств. Обработчик набора свойств может также добавить или заменить страницы свойств для определенных элементов панели управления, но эта тема здесь не будет рассматриваться.
Эта статья представляет расширение, которое позволит Вам изменять время создания, модификации и последнего доступа к файлу прямо из его окна свойств, оперируя прямыми вызовами SDK без использования MFC или ATL/WTL. Я не пробовал использовать MFC или WTL страницы свойств в расширении. Поступая так можно обмануться, потому что оболочка ожидает получения дескриптора к набору свойств (HPROPSHEETPAGE), а MFC скрывает эту деталь в реализации CPropertyPage. (Я не знаю как реализовать это с помощью WTL.)
Если Вы посмотрите свойства для файлов *.URL (ярлычки к internet страницам), Вы можете увидеть обработчик набора свойств в действии. Вкладка "CodeProject" является наглядным примером расширения из этой статьи. Вкладка "Web Document" показывает расширение, инсталлированное IE.
