Данная статья посвящена сразу двум нововведениям в Windows 7, облегчающим работу с телефонами, принтерами, плеерами и другим оборудованием. Речь о новой папке “Устройства и принтеры” и страницах Device Stage.
Теперь все устройства собраны в одном месте и доступны в два щелчка: “Пуск” -> “Устройства и принтеры”. Устройства отображаются фотореалистичными иконками, так что нам даже не надо знать, как они называются. Двойной щелчок по иконке откроет страницу Device Stage, на которой представлены основные функции и параметры устройства. Отметим, что папка “Устройства и принтеры” и Device Stage – это именно две (а не одна) возможности, дополняющие друг друга. Почти все оборудование отображается в “Устройствах и принтерах”, но не у каждого есть страница Device Stage.
Для знакомства с новшествами будем использовать обычную флешку. За четыре шага, постепенно усложняя пример, мы создадим полноценную страницу Device Stage. Каждый шаг - это готовое к использованию, реально работающее решение. К статье прилагаются четыре папки, по одной на шаг.
Для хранения иконок и информации об оборудовании в Windows появилась специальная папка – DeviceMetadataStore. Когда мы подключаем к компьютеру свой плеер или телефон, система находит в ней соответствующий .devicemetadata-ms-файл с описанием.
devicemetadata-ms-файлы автоматически загружаются с сервера Microsoft, но их можно положить в папку %PROGRAMDATA%\Microsoft\Windows\DeviceMetadataStore и вручную.
Файлы описания создаются разработчиками устройств и передаются Microsoft. Перед размещением на сервере Microsoft проверяет, помечает и подписывает полученные файлы.
ПРИМЕЧАНИЕ Обратите внимание, Microsoft помечает и подписывает файлы описания. Позже мы к этому вернемся. |
На самом деле, файл .devicemetadata-ms – это архив. Чтобы посмотреть его содержимое, нужно поменять разрешение на .cab. Чуть позже мы подробно рассмотрим содержимое таких архивов (собственно, этому-то и посвящена статья).
Какой именно файл соответствует данному устройству, система определяет с помощью:
Любое оборудование, совместимое с Windows, при подключении сообщает системе один или несколько идентификаторов Hardware ID. С помощью этих идентификаторов Windows определяет, какой драйвер нужно использовать для устройства. Теперь Hardware ID применяется и для поиска соответствующего devicemetadata-ms-файла.
В некоторых случаях такой способ связи устройства c файлом описания подходит, а в некоторых – нет. Причина в том, что разные устройства могут использовать один и тот же драйвер, и, соответственно, сообщать один и тот же Hardware ID. Простой пример: новая модель телефона использует тот же драйвер, что и старая. Пользователю гораздо приятнее будет увидеть иконку с изображением своего нового телефона. И это действительно важно, ведь мы говорим о нововведениях, призванных упростить и сделать приятной работу пользователя. Какой смысл в фотореалистичной иконке, если на ней изображен другой аппарат? Коллега на работе радовался как ребенок, когда его новая красивая красная мышка от Microsoft отобразилась в папке “Устройства и принтеры” иконкой именно красного цвета. А ведь мышка выпускается в шести цветовых вариантах. Тут мы подошли к новому способу идентификации оборудования – Model ID.
Model ID – это новый способ идентификации устройств, появившийся в Windows 7. Model ID не используется для поиска драйверов, а значит, не служит заменой Hardware ID. Устройству можно назначить только один Model ID. Конечно, старые устройства не имеют Model ID и не сообщают его при подключении, но в новые модели производители могут добавить эту возможность.
ПРИМЕЧАНИЕ Еще один пример того, насколько сильно Windows 7 отличается от предшественников. Новая система идентификации устройств, затрагивающая производителей - это не шутки. |
В зависимости от выбора разработчика, в файле описания указывается или список Model ID, или список Hardware ID тех устройств, к которым относится файл.
Подведем промежуточный итог и набросаем краткий план действий. Сейчас наша флешка отображается в папке “Устройства и принтеры” иконкой по умолчанию, никакой специфической информации об устройстве не выводится (рисунок 1).
Рисунок 1. Отображение флешки в папке “Устройства и принтеры” по умолчанию
Чтобы Windows могла показать более полные данные о флешке, нужно:
В нашем случае выбор между Hardware ID или Model ID совершенно непринципиален. Возьмем Hardware ID, так как у любой флешки он точно есть.
Чтобы узнать Hardware ID, нужно: в папке “Устройства и принтеры” щелкнуть правой кнопкой мыши по иконке флешки -> Свойства -> вкладка Оборудование -> тип Дисковые устройства -> кнопка Свойства -> в новом окне вкладка Сведения -> в выпадающем списке Свойство : ИД оборудования (рисунок 2).
Рисунок 2. Список Hardware ID
Вверху находится идентификатор, точнее всего определяющий устройство, далее идут более общие идентификаторы. Для наших целей лучше взять самый верхний.
Как уже говорилось, файл .devicemetadata-ms – это на самом деле архив. Этот архив содержит только XML-файлы и картинки, разложенные по подпапкам. Все описывается с помощью XML, так что нам придется много с ним работать. Оставим возню с разными видами блокнотов школьникам и любителям “альтернативных решений”. Мы-то знаем, что ничего лучше Visual Studio не придумали - остается только добавить нужные XSD схемы в папку ..\Visual Studio\Xml\Schemas
Что бы получить XSD-схемы, нужно установить “Microsoft Device Experience Development Kit” (см. ссылки в конце статьи). Схемы находятся в каталоге ..\Microsoft Device Experience Development Kit 7R2\General\XML Schemas\
Для создания файлов .devicemetadata-ms нужна утилита CABARC.EXE. Отдельно её скачать нельзя, она идет в комплекте с “Device Stage Visual Editor Tool”. Да, да, для изготовления страниц Device Stage есть GUI-приложение. Но его мы использовать не будем. И не потому, что нам чужд комфорт, или мы презираем все, чем могут пользоваться непосвященные непрограммисты (как это часто делают ярые воинствующие поклонники не-Windows-систем). Просто работа “вручную“ даст нам больше гибкости и лучшее понимание процесса.
В первом шаге мы создадим самый простой файл описания, не использующий возможности Device Stage. Нет никакой необходимости приводить в тексте статьи полные листинги XML-файлов – файлы для первого шага можно найти в папке “example1”, прилагаемой к статье. Поэтому в листингах будут показаны только те части, на которые нужно обратить внимание, самое главное выделено.
На рисунке 3 представлена структура архива .devicemetadata-ms. В качестве названия архива должен использоваться глобальный уникальный идентификатор (GUID). Например: 0055f9a7-ffef-4017-be40-e1e118fa4e86.devicemetadata-ms.
Рисунок 3. Структура архива .devicemetadata-ms, не поддерживающего Device Stage
Из рисунка 3 видно, что нужно создать три XML-файла (PackageInfo.xml, DeviceInfo.xml, WindowsInfo.xml) и одну иконку.
Как и следует из названия, этот файл используется для описания .devicemetadata-ms-пакета (файла описания). В нем указывается такая информация, как время создания пакета, используемые XML-схемы, локализация по умолчанию. Но самое главное – там указывается список Hardware ID (или список Model ID), c которыми связан пакет.
Листинг 1. PackageInfo.xml<?xmlversion="1.0"encoding="utf-8" standalone="yes"?> <PackageInfo xmlns="..."> <MetadataKey> <HardwareIDList> <HardwareID>DOID:USBSTOR\Disk-Pretec_01GB____________2.00</HardwareID> </HardwareIDList> <Locale default="true">en-US</Locale> <LastModifiedDate>2011-07-02T23:22:09Z</LastModifiedDate> </MetadataKey> <PackageStructure> <Metadata MetadataID="...">PackageInfo.xml</Metadata> <Metadata MetadataID="...">DeviceInformation</Metadata> <Metadata MetadataID="...">WindowsInformation</Metadata> </PackageStructure> </PackageInfo> |
Обратите внимание на приставку “DOID”, которую нужно указать перед Hardware ID. Есть еще приставка “SFDOID” (Single Function Device), но она сейчас не используется и зарезервирована для будущих версий Windows. Эти приставки указывают на то, сколько функций выполняет устройство – одну или несколько. Например, часто встречаются многофункциональные устройства, сочетающие в себе принтер, факс и сканер. Чуть позже мы еще раз поговорим о функциях устройства.
Здесь описываются правила отображения иконки и страницы Device Stage.
Листинг 2. WindowsInfo.xml<?xmlversion="1.0"encoding="utf-8" standalone="yes"?> <WindowsInfo xmlns="..."> <ShowDeviceInDisconnectedState>false</ShowDeviceInDisconnectedState> <LaunchDeviceStageOnDeviceConnect>false</LaunchDeviceStageOnDeviceConnect> <LaunchDeviceStageFromExplorer>false</LaunchDeviceStageFromExplorer> </WindowsInfo> |
ShowDeviceInDisconnectedState – показывать устройство в папке “Устройства и принтеры”, когда устройство не подключено. Иконка неподключенного устройства будет более бледной (см. рисунок 1). Кстати, задать свою отдельную иконку для отключенного состояния оборудования нельзя.
LaunchDeviceStageOnDeviceConnect – открывать страницу Device Stage автоматически при подключении устройства.
LaunchDeviceStageFromExplorer – открывать Device Stage по двойному щелчку по иконке.
Лучше один раз увидеть, чем сто раз услышать (рисунок 4).
Рисунок 4. Описание DeviceInfo.xml
Рисунок 4 говорит сам за себя. Стоит отметить только узел DeviceCategory, который в нашем случае указывает на то, что устройство – это флешка. Если устройство – многофункциональное, можно указать несколько категорий (например, принтер часто является и сканером). Помните, выше, когда описывали PackageInfo.xml, мы упоминали приставки “DOID” и “SFDOID”?
Первый узел DeviceCategory указывает на главную категорию – устройство, сочетающее в себе и принтер и сканер, чаще всего называют “принтером со встроенным сканером”, но не “сканером со встроенным принтером”.
ПРИМЕЧАНИЕ Как-то мне пришлось вступить в спор с вполне авторитетными товарищами, которые утверждали, что XML – это что-то вроде таблицы в базе данных. Т.е. порядок следования XML-узлов точно так же непринципиален, как и порядок строк в таблице. Но мы знаем, что в XML порядок следования узлов может иметь значение. |
Полный список категорий с пояснениями находится в документе “How to Create a Device Metadata Package for Devices and Printers”.
Теперь у нас есть все необходимые файлы (опустим процесс получения иконки). Создадим следующую структуру директорий (листинг 3):
Листинг 3. Структура директорий для создания архива .devicemetadata-ms.\0055f9a7-ffef-4017-be40-e1e118fa4e86\ .\0055f9a7-ffef-4017-be40-e1e118fa4e86\PackageInfo.xml .\0055f9a7-ffef-4017-be40-e1e118fa4e86\DeviceInformation\DeviceInfo.xml .\0055f9a7-ffef-4017-be40-e1e118fa4e86\DeviceInformation\i_disk_wave_black.ico .\0055f9a7-ffef-4017-be40-e1e118fa4e86\WindowsInformation\WindowsInfo.xml |
Запускаем CABARC.EXE (листинг 4).
Листинг 4. Вызов CABARC.EXE (все в одну строку без переносов)Cabarc.exe -r -p -P .\0055f9a7-ffef-4017-be40-e1e118fa4e86\ N .\0055f9a7-ffef-4017-be40-e1e118fa4e86.devicemetadata-ms .\0055f9a7-ffef-4017-be40-e1e118fa4e86\*.* |
Копируем 0055f9a7-ffef-4017-be40-e1e118fa4e86.devicemetadata-ms в DeviceMetadataStore.
Во втором шаге мы доработаем пример так, что при двойном щелчке по иконке будет открываться простая страница Device Stage. Готовый пакет находится в папке “example2”.
В структуре архива .devicemetadata-ms появится новая папка DeviceStage (рисунок 5).
Рисунок 5. Структура архива .devicemetadata-ms, поддерживающего Device Stage
Прежде всего подредактируем WindowsInfo.xml, чтобы по двойному щелчку по иконке открывалась страница Device Stage.
Листинг 5. Изменения в WindowsInfo.xml для поддержки Device Stage<?xmlversion="1.0"encoding="utf-8" standalone="yes"?> <WindowsInfo xmlns="..."> <ShowDeviceInDisconnectedState>false</ShowDeviceInDisconnectedState> <LaunchDeviceStageOnDeviceConnect>false</LaunchDeviceStageOnDeviceConnect> <LaunchDeviceStageFromExplorer>true</LaunchDeviceStageFromExplorer> </WindowsInfo> |
Нужно также внести изменения и в PackageInfo.xml (листинг 6).
Листинг 6. Изменения в PackageInfo.xml для поддержки Device Stage<?xmlversion="1.0"encoding="utf-8" standalone="yes"?> <PackageInfo xmlns="..."> ... <PackageStructure> <Metadata MetadataID="...">PackageInfo.xml</Metadata> <Metadata MetadataID="...">DeviceInformation</Metadata> <Metadata MetadataID="...">WindowsInformation</Metadata> <Metadata MetadataID="...">DeviceStage</Metadata> </PackageStructure> <Relationships> <ExperienceID>E129DCA4-8767-425D-B7A5-EC179393BEF4</ExperienceID> </Relationships> </PackageInfo> |
Добавилась еще одна Metadata, но это неинтересно. Обратить внимание стоит на узел ExperienceID. Помните, в начале статьи мы говорили о том, что Microsoft помечает и подписывает .devicemetadata-ms-файлы (см. раздел “Откуда Windows берет информацию об устройстве”)? Узел ExperienceID и есть та самая метка, которую выставляет Microsoft. Для экспериментов мы подставили произвольный GUID. Конечно, подставить GUID самостоятельно без Microsoft мы можем, а вот подписать пакет без Microsoft не получится.
ПРИМЕЧАНИЕ В “легальных” архивах .devicemetadata-ms находится файл с подписью - sign.cat. |
И тут нас ждет небольшое разочарование. Чтобы наш неподписанный файл описания был принят системой, нужно перейти в тестовый режим (листинг 7).
Листинг 7. Переход в тестовый режим. Требуется перезагрузка.Bcdedit -set testsigning ON |
Behavior.xml описывает внешний вид страницы Device Stage и то, какие функции на ней будут представлены (рисунок 6).
Рисунок 6. Описание Behavior.xml
В странице Device Stage мы использовали не все предусмотренные стилистические возможности.
Отметим, что значение атрибута ExperienceID должно совпадать со значением одноименного узла в файле PackageInfo.xml.
В узле taskCategoryMapping перечисляются доступные задачи. В нашем примере указана одна задача – “Просмотр файлов”. Более подробно задачи мы рассмотрим в четвертом шаге.
Текст строк маркированного списка (узел marketingBullets) указывается в Resource.xml и связывается с помощью атрибута id узлов bullet (листинг 8).
Листинг 8. Resource.xml<?xmlversion="1.0"encoding="utf-8"?> <stringTable xmlns="..."> <string id="bullet1">Example for RSDN</string> <string id="bullet2">RSDN Group and Microsoft contest</string> </stringTable> |
Создаем архив .devicemetadata-ms, входим в тестовый режим, копируем архив в DeviceMetadataStore, радуемся.
В шапке Device Stage взамен маркированного списка (см. рисунок 6) можно выводить до 6 текущих параметров устройства, например, уровень заряда батареи и количество свободного места. Батареи во флешке нет, поэтому будем довольствоваться выводом информации о свободном месте (рисунок 7).
Рисунок 7. Вывод информации о свободном месте
Внесем дополнения в Behavior.xml (листинг 9).
Листинг 9. Изменения в Behavior.xml для вывода информации о свободном месте<?xmlversion="1.0"encoding="utf-8"?> <deviceBehavior xmlns="..."> ... <statusItems statusProvider="{c2dae44d-c850-425c-b466-d8cbc1469f5d}" statusPropList="prop:System.Devices.StorageFreeSpacePercent;"> </statusItems> </deviceBehavior> |
В Windows 7 предусмотрены встроенные возможности по определению текущих параметров подключаемых устройств. Для их использования нужно знать идентификатор statusProvider-а и названия свойств. Ну и конечно, нужно, чтобы устройство поддерживало такую возможность. Можно создавать свои собственные статусы – интересная тема, но и объемная. Придется отложить её для будущих статей. Тут отметим только, что информацию о встроенных statusProvider-ах можно найти в “Microsoft Device Experience Development Kit”. Например, используемый нами statusProvider {c2dae44d-c850-425c-b466-d8cbc1469f5d} описан в документе “Windows 7 Device Stage Portable Devices Development Guide”.
Еще немного доработаем пример. Пусть по щелчку по статусу (информации о свободном месте) будет открываться содержимое флешки, т.е. будет выполняться задача “Просмотр файлов”, о которой мы уже говорили в “Шаге 2”. Посмотрите на листинг 10.
Листинг 10. Выполнение задачи по щелчку по статусу<?xmlversion="1.0"encoding="utf-8"?> <deviceBehavior xmlns="..."> ... <taskCategoryMapping> <taskRef taskGroupGuid="{07deb856-fc6e-4fb9-8add-d8f2cf8722c9}" taskId="{29e7ef4e-b212-4bf9-b95b-1e073fba48e8}" /> </taskCategoryMapping> <statusItems statusProvider="{c2dae44d-c850-425c-b466-d8cbc1469f5d}" statusPropList="prop:System.Devices.StorageFreeSpacePercent;"> <statusLinks> <statusLink statusProp="System.Devices.StorageFreeSpacePercent" taskId="{29e7ef4e-b212-4bf9-b95b-1e073fba48e8}"/> </statusLinks> </statusItems> </deviceBehavior> |
Задача должна быть обязательно указана и в узле taskCategoryMapping, то есть нельзя повесить задачу на статус и при этом не вывести её повторно среди списка всех доступных задач.
Чтобы иконка устройства отображалась на панели задач, как на рисунке 7 справа, нужно отредактировать WindowsInfo.xml – листинг 11.
Листинг 11. Включаем иконку на панели задач. WindowsInfo.xml<?xmlversion="1.0"encoding="utf-8" standalone="yes"?> <WindowsInfo xmlns="..."> <ShowDeviceInDisconnectedState>false</ShowDeviceInDisconnectedState> <LaunchDeviceStageOnDeviceConnect>true</LaunchDeviceStageOnDeviceConnect> <LaunchDeviceStageFromExplorer>true</LaunchDeviceStageFromExplorer> </WindowsInfo> |
Мы уже знаем, что в Windows 7 есть встроенные statusProvider-ы. Также в Windows есть и встроенные задачи. Задачи рассортированы по категориям. Чтобы добавить задачу, нужно знать её GUID и GUID категории (узел taskRef в листинге 10). Можно создавать свои задачи, которые будут открывать сайты и запускать приложения. Кроме того, для самодельных задач можно выставлять условия. Например, сделать так, что задача будет видна, только если компьютер подключен к сети или установлена определенная программа. Можно даже проверять ключи в реестре.
В четвертом шаге мы добавим самодельную задачу, открывающую внутри Device Stage web-страницу (рисунок 8). Задача будет видна, только если есть подключение к интернету.
Рисунок 8. Задача, открывающая web-страницу.
Все задачи должны относиться к какой-нибудь категории. Поэтому вначале нужно её (категорию) создать. Посмотрите на рисунок 9. Там показаны новые элементы в папке DeviceStage нашего архива .devicemetadata-ms.
Рисунок 9. Новые файлы и папки для самодельной задачи
Создать свою категорию задач – это значит создать подпапку для “Task”. При этом название папки должно следовать шаблону: {произвольный GUID} (скобочки обязательны).
Далее нужно подготовить Tasks.xml и Resource.xml (листинг 12).
Листинг 12. Tasks.xml<?xmlversion="1.0"encoding="utf-8"?> <taskGroup revocation="false" xmlns="..." taskGroupGuid="{099b7f7d-4d13-4f89-869d-6974ede694b1}"> <tasks> <task id="{1bf99ef2-6b9b-4d9d-832a-cbffd60eb966}" rank="0" issueTime="2010-06-02T10:56:20Z" requiresElevation="false"name="taskName" description="taskDescription" icon="win.ico"> <requirements> <online /> </requirements> <command type="HostedSite"> <arguments> <commandLine>http://www.rsdn.ru</commandLine> </arguments> </command> </task> </tasks> </taskGroup> |
<?xmlversion="1.0"encoding="utf-8"?> <stringTable xmlns="..."> <string id="taskName">RSDN</string> <string id="taskDescription">Visit RSDN</string> </stringTable> |
В Tasks.xml значение атрибута taskGroupGuid должно совпадать с GUID категории (с названием папки, которую мы создали ниже “Task”). Идентификатор задачи (атрибут id узла task) – это произвольный GUID, заключенный в фигурные скобки. Также обратим внимание на необязательный узел requirements. В нем задаются условия отображения задачи. В нашем примере задача требует подключения к Интернет.
Перечислять возможные типы команд (атрибут type узла command) мы не будем – ведь у нас есть Visual Studio с подключенными XSD-схемами, которая выводит всплывающие подсказки. Вроде бы дополнительных пояснений листинг 12 не требует.
Все готово, остается только добавить задачу в behavior.xml. Из листинга 13 видно, что самодельная задача добавляется точно так же, как встроенная в Windows.
Листинг 13. Behavior.xml. Самодельные задачи добавляются так же, как встроенные в Windows<?xmlversion="1.0"encoding="utf-8"?> <deviceBehavior xmlns="..."> ... <taskCategoryMapping> <taskRef taskGroupGuid="{099b7f7d-4d13-4f89-869d-6974ede694b1}" taskId="{1bf99ef2-6b9b-4d9d-832a-cbffd60eb966}" /> <taskRef taskGroupGuid="{07deb856-fc6e-4fb9-8add-d8f2cf8722c9}" taskId="{29e7ef4e-b212-4bf9-b95b-1e073fba48e8}" /> </taskCategoryMapping> ... </deviceBehavior> |
Если вы дочитали до этого места – значит меня, как автора, можно поздравить. Еще немного, и издателю пришлось бы делать твердый переплет, а мне – писать благодарности. И все же, статья оставляет больше вопросов, чем дает ответов.
Мы узнали, как организованы новые возможности Windows 7 – папка “Устройства и принтеры” и страницы Device Stage, как система различает устройства, и о том, что в Windows 7 появилась новая система идентификации оборудования по ModelID. А еще нас поджидало разочарование – мы никогда не сможем сделать для своего телефона самую лучшую, самую удобную страницу Device Stage. Вернее, сделать-то сможем, а вот использовать – вряд ли, не будем же мы все время сидеть в тестовом режиме. Нам остается только довольствоваться фотореалистичной иконкой – это не требует подписи Microsoft.
ПРИМЕЧАНИЕ Это действительно очень грустно. Почему у нас нет возможности использовать свои страницы Device Stage? Понятно, что причина этому есть. Но, наверно, можно найти и компромисс. Если вы знаете, как сообщить Microsoft такое предложение, свяжитесь со мной. |
По самым скромным прикидкам, за бортом остались:
Нельзя не отметить высокое качество обучающих материалов Microsoft. Описание очень полное, хорошо структурировано и написано понятным языком.
Ссылки на все материалы, упоминающиеся в статье, перечислены на странице “Windows Device Experience” (я же говорил, что информация хорошо структурирована): http://www.microsoft.com/whdc/device/DeviceExperience/default.mspx.