Вашему вниманию предлагается перевод статьи из Microsoft Technet, посвяженной новой технологии Windows Vista - Microsoft Gadgets.
Суть Microsoft Gadgets в том, что любой желающий может сам написать небольшое приложение и затем использовать его на панели Sidebar в Windows Vista. Хотя с визуальной точки зрения программки могут выглядеть весьма эффектно и тешить самолюбие их автора каждый день при включении компьютера, изнутри эти самые гаджеты представляют собой простой HTML, никаких навыков программирования не требуется. Технология самописных гаджетов должна способствовать популяризации Windows Vista. Статью читайте ниже.
Вашему вниманию предлагается перевод статьи из Microsoft TechnetM, посвяженной новой технологии Windows Vista - Microsoft Gadgets.
Суть Microsoft Gadgets в том, что любой желающий может сам написать небольшое приложение и затем использовать его на панели Sidebar в Windows Vista. Хотя с визуальной точки зрения программки могут выглядеть весьма эффектно и тешить самолюбие их автора каждый день при включении компьютера, изнутри эти самые гаджеты представляют собой простой HTML, никаких навыков программирования не требуется. Технология самописных гаджетов должна способствовать популяризации Windows Vista. Статью читайте ниже.
Использование скриптов в Windows Vista
Создание гаджетов
Краткое введение в технологию Microsoft Gadgets
Windows Vista наполнена множеством новых вещей, и одна из самых ожидаемых их них - панель Windows Sidebar, - предназначена специально для тех кто пишет скрипты. Панель Windows Sidebar это область экрана, зарезервированная для небольших программ - гаджетов. Также как панель Quick Launch специально зарезервирована для размещения ярлыков программ. Гаджеты - это программы с очень маленьким кодом. Например, в состав Widows Vista входят нескол
Давайте посмотрим, сможете ли вы создать ваш первый гаджет сами.
Создание первого гаджета
Для того чтобы создать свой гаджет вам нужно только две вещи:
Файл-'манифест' с именем Gadget.xml. Этот манифест содержит все настройки для вашего гаджета, включая его имя, автора и информацию о правах (копирайт) и информацию о странице HTML которой фактически является гаджет.
Файл HTML (например, Test.htm). Несмотря на то, что гаджеты могут выглядеть не похоже на них, гаджеты в действительности не более чем файлы HTML: вы просто создаете HTML файл, добавляете соответствующие тэги и код скрипта, и получаете ваш собственных гаджет.
Для того чтобы создать гаджет требуются только эти две вещи. Конечно, когда вы создаете более сложные гаджеты, вам понадобится иметь дело с файлами иконок, графическими файлами, файлами настроек и другими элементами. Но до них мы дойдем в свое время .
Здесь написано, как вам подготовить все необходимые файлы и 'скомпилировать' их в гаджет, без использования какого бы то ни было проприетарного компилятора:
Поместите все файлы с папку для гаджетов.
Точно так: поместите все файлы в папку, и вы получите гаджет. Без компиляции, компиляторов, ничего больше утомительных или технических действий - просто скопируйте все файлы в выбранную папку.
Папка Gadgets
Для начала найдем специальную папку 'Gadgets'. Быстро добраться до вашей папки Gadgets можно набрав в окошке Run (Выполнить) команду:
'%userprofile%appdatalocalmicrosoftwindows sidebargadgets'
Откроется окошко Customize Start Menu (Настойка Меню 'Пуск'), прокрутите список вниз и поставьте галочку напротив пункта Run command (Команда 'Выполнить'). Щелкните OK дважды, и команда Run вернется на свое законное место.
Внутри папки Gadgets создайте новую папку. Дайте ей любое имя, какое захотите, добавив в конце имени расширение .gadget (например, Test.gadget). Имя гаджета определяется информацией из файла манифеста, а не по имени папки (Спецы определяют это с большими трудностями).
Все что вам нужно сделать сейчас это поместить ваши файлы (такие как Gadget.xml и Test.htm) в эту папку. Означает ли это что у вас уже есть гаджет? Будьте уверены - это так. Фактически осталось только нажать + наверху панели Windows Sidebar , для того чтобы отобразить набор гаджетов имеющихся на вашем компьютере. Новый гаджет созданный вами, появиться в окошке в списке доступных гаджетов.
Установка гаджета
Если вы не уверены что ваш гаджет действительно появится в списке доступных гаджетов, вы можете установить его просто перетащив его иконку на панель Windows Sidebar и отпустить кнопку мыши (или просто щелкнуть правой кнопкой мыши на иконке гаджета и щелкнуть Add (Добавить). Ваш гаджет появится и будет готов к использованию. Если вы решите удалить его с панели Sidebar , просто щелкните на нем и, не отпуская кнопки мыши, дождитесь появления маленького крестика в виде буквы Х, который появится в правом верхнем уголке гаджета.
Файл манифеста
Как мы заметили ранее, для того чтобы создать собственный гаджет необходимы только две вещи: файл манифеста и HTML файл.
Файл манифеста это просто технический термин. В сущности, мы говорим о чем-то похожем на . INI файл, простой текстовый файл (в данном случае в формате XML), который содержит настройки для гаджета. Общеизвестно, идея написания вещей в XML может привести вас в трепет и заставить дрожать поджилки. Слушайте, не беспокойтесь об этом. Вот простая основа XML файла, такая, с какой вам придется иметь дело:
Вот что мы имеем в виду:

Предупреждая ваши вопросы: да, вы можете просто скопировать этот файл и использовать его как он есть, просто внеся изменения (если необходимо) в совсем небольшое число значений в тэгах. (Да и не забудьте - вы должны дать файлу имя Gadget.xml.) Тэги, которые, вы, может быть захотите (должны) изменить, описаны в следующей таблице:
|
Тэг |
Описание |
|
<name> |
Имя гаджета как оно будет отображено в списке выбора гаджета |
|
<author> |
Имя человека который написал гаджет. Информация о авторе, копирайте и описание гаджета появятся в окне выбога гаджета, когда вы щелкните по соответствующему имени (см. иллюстрацию показанную ниже). |
|
<copyright> |
Информация о правах (копирайте), включая имя держателя прав и дату копирайта. |
|
<description> |
Краткое описание гаджета и того, что он делает. |
|
<icon> |
Имя файла иконки (иконка - это графическое изображение, отображаемое в окне выбора гаджета). |
|
<code> |
Возможно это не самое интуитивно понятное имя тэга в мире, но это просто имя HTML файла который и является гаджетом. |
|
<website> |
Веб сайт связанный с данным гаджетом. |
Для ясности приведем рисунок на котором показаны привязки элементов файла-манифеста к элементам, показанным в окошке выбора гаджета:

Создание иконки
Использовать или нет собственную иконку для вашего гаджета: если вы не сделаете ее или если вы не укажите никакой иконки в файле манифеста, в окне выбора гаджета будет установлена иконка по умолчанию.
'иконка' это просто имя, которое мы дали файлу с изображением. В действительности это не иконки Windows (файлы с расширением .ICO), которые могут быть созданы с помощью специальных программ. Вместо этого иконка - это просто файл с картинкой в формате .GIF, .JPG, или .PNG. Гаджеты поставляемые с Windows Vista все используют графику в формате .PNG потому, что графика в формате .PNG позволяет использовать прозрачность. Но вы не обязаны сохранять ваши иконки в формате .PNG. Можете использовать Paint, создайте иконку и сохраните ее в формате .JPG . Ваша иконка все равно будет хорошо выглядеть в окне выбора гаджета.
А какого размера должна быть сделана иконка? Оптимальный размер это 64 на 64 пиксела. Окно выбора гаджета изменит размер иконки до необходимого минимума, но, создав иконку 64х64 пиксела, вы обезопасите себя от любых искажений картинки, связанных с необходимостью сжимать или растягивать изображение до необходимого размера.
Означает ли это, что вы можете использовать дополнительные иконки в файле манифеста? Возможно, хотя, если честно, мы не уверены, что вы должны использовать эти дополнительные иконки.
Файл HTML
Файл HTML, который является основой гаджета, действительно ничем не отличается от обычной веб-страницы которая использует динамический HTML. Для создания HTML файла вы можете использовать любые допустимые HTML тэги (включая и CSS стили) плюс скрипт. Сейчас мы покажем вам пример HTML страницы. Но перед тем как мы это сделаем, посмотрим как вам внедрить WMI код в гаджет.
Работа с WMI
Как системный администратор вы используете написание скриптов, чтобы делать тяжелую работу с помощью WMI . Кроме того, WMI это технология которая помогает вам управлять всем от принтеров до дисков и мышей и мониторов. И лучше всего то, что WMI легко использовать. Например, предположим, вы хотите узнать название операционной системы установленной на локальном компьютере. Нет проблем, вот WMI скрипт который вернет эту информацию вам:

Если вы планируете создавать гаджеты для системного администрирования, для вас плохие новости: скрипты WMI которые вы используете, не будут работать в гаджете. (Стойте, не впадайте в крайности: дальше будут новости лучше, обещаем.) Это потому, что внутри гаджет это не более чем веб-страница, и из соображений безопасности, веб-страницы не способны использовать функцию GetObject. Если вы поместите последующий код в гаджет все закончится этим сообщением об ошибке:
ActiveX component can't create object: 'GetObject' (Не возможно создание объекта компонентом ActiveX : 'GetObject')
Ох-ох-ох:
Но, без паники. Вы все еще можете использовать WMI скрипты внутри гаджета, вы только не можете использовать GetObject и имя winmgmts. Вместо этого, вам нужно использовать CreateObject для создания экземпляра объекта WbemScripting.WbemLocator , затем используйте метод ConnectServer для подключения к WMI сервису. Другими словами, вам нужен скрипт похожий на этот:

Единственное отличие скрипта использующего WMI moniker от скрипта который использует метод ConnectServer заключается в том как вы создаете подключение в сервису WMI . Ранее для создания такого подключения вы использовали одну строчку кода:
Set objWMIService = GetObject("winmgmts:" & strComputer & "rootcimv2")
Теперь вы используете две строки кода для создания подключения (да, рабочая нагрузка удваивается!): вы создаете экземпляр объекта WbemScripting.SWbemLocator, затем, используя метод ConnectServer, подключаетесь к сервису WMI. Заметьте, что мы передаем в ConnectServer два параметра: имя компьютера, к которому подключаемся (представленное переменной strComputer) и пространство имен WMI к которому хотим подключиться (в данном случае rootcimv2):
Set objLocator = CreateObject("WbemScripting.SWbemLocator")
Set objWMIService = objLocator.ConnectServer(strComputer, "rootcimv2")
Теперь вернемся к нашей правильно-спланированной статье.
Создание HTML файла
Как мы уже заметили ранее, гаджет это всего лишь HTML файл. Это означает, что любые элеметны (включая динамические элементы) которые вы можете использовать в странице HTML, также могут быть использованы и в гаджете. Как вы вероятно уже заметили, гаджет включает в себя код на VBScript. И, несмотря на то, что многие ранние гаджеты доступные через веб-сайт Microsoft Gadgets использовали JScript или JavaScript, но VBScript работает все же лучше (скоро вы в этом убедитесь).
Ранее мы уже представляли вам гаджет который возвращает имя операционной системы установленной на локальном компьютере, и теперь давайте посмотрим как мы можем вставить этот скрипт в гаджет. Мы уже сделали очень простой гаджет, который включает в себя одну кнопку, если щелкнуть на которой, гаджет отобразит значение свойства Caption операционной системы в окошке сообщения. Вот HTML код нашего гаджета:

Как вы можете видеть, в этом коде нет ничего особенного: это простейший HTML , который не делает ничего больше чем отображение одной кнопки на странице. Когда вы щелкаете по этой кнопке, выполняется подпрограмма с именем RunSub , затем эта подпрограмма использует WMI для определения имени установленной на компьютере операционной системы.
Единственная вещь здесь, на которой стоит остановиться подробнее это тэг <STYLE>. Когда мы начнем создавать более утонченные гаджеты мы обсудим тэг <STYLE> детальнее, но сейчас, однако, мы просто отметим, что мы используем этот тэг для настройки высоты и ширины нашего гаджета по умолчанию:
<style> body{width:120;height:160} </style>
Этот тэг просто говорит, что мы хотим чтобы наш гаджет был 120 пикселей в ширину (панель Windows Sidebar в ширину имеет приблизительно 130 пикселей) и 160 пикселей в высоту. Для данного гаджета 160 высота в пикселей может быть и многовато, и если это так, то мы просто назначим свойству height другое значение:
<style> body{width:120;height:40} </style>
Когда вы установите наш гаджет на панель Windows Sidebar , он будет выглядеть примерно так

И вот уто произойдет когда вы щелкните на кнопке:

Отображение данных в теге <SPAN>
Ну что ж, мы создали гаджет, который когда на нем щелкаешь, отображает имя операционной системы в окошке сообщения. В этом нет ничего плохого и вероятно бывает необходимо, чтобы гаджет возвращал так много информации что у вас нет выбора кроме как отобразить ее в окошке сообщения, в окне Internet Explorer или еще где-нибудь.
С другой стороны, раньше или позже вам понадобиться создать гаджет, на который не требуется воздействовать для получения окна с сообщением, и в котором не требуется щелкать по кнопке для того, чтобы получить некоторую информацию. Скажем, вы решили создать часы для вашей панели Windows Sidebar. Это здорово, но вы действительно хотите щелкать по кнопке каждый раз, когда решите узнать который час? И когда вы сделаете это, хотите ли вы, чтобы время отображалось в окошке сообщения? Конечно, жителям планеты Омикрон IV нравится такой способ. Но люди находят это настолько скучным, что даже не заслуживает упоминания.
Другими словами нам нужны возможности для создания гаджетов которые могут:
Отображать данные внутри границ самого гаджета. Далее в статьях этой серии мы покажем вам путь как отображать информацию графически, но сейчас мы сфокусируемся на отображении текстовых данных.
Получать данные автоматически, без какого-либо участия пользователя.
Периодически обновлять информацию. Например гаджет который ведет мониторинг объема доступной памяти компьютера (скоро мы сделаем с вами такой гаджет) не должен однажды получить значение доступной памяти только в момент своего запуска и затем сообщать что все хорошо. Вместо этого, необходимо периодически получать новое значение для текущего момента времени.
Это звучит сложно, но мы будем делать это легко изучая эти возможности по одной за раз. Давайте начнем с обсуждения тэга <SPAN>, простого и легкого способа для отображения информации внутри тела самого гаджета.
Вот исправленная версия нашего HTML файла. В этом новом гаджете вы все еще должны щелкнуть на кнопке для запуска подпрограммы RunSub, однако, в данном случае имя операционной системы не выводится во окне сообщения, а вместо этого оно пишется на самом гаджете:

Когда мы щелкаем кнопку в этом гаджете, возвращаемая информация отображается внутри самого гаджета:
Бонус: украшаем гаджет с помощью фона
Мы упомянем лишь одну простую технику, с которой вы сможете приукрасить ваши гаджеты. Например, предположим у вас есть картинка, которая, по вашему мнению, может стать хорошим фоном для гаджета. В этом случае, все, что вам нужно сделать, это установить значение атрибута background в тэге <BODY> вашего HTML файла. Эта строчка кода указывает гаджету использовать файл с именем background . jpg как фон для гаджета:
<body background = "background.jpg">
Просто убедитесь, что файл background.jpg находится в папке с вашим гаджетом.
С другой стороны, вы можете создать гаджет с другим фоновым цветом добавив параметр bgcolor в тэг <BODY>. Хотите имеет гаджет с ярко красным фоном? Да, почему нет?
<body bgcolor = "red">
Наконец, вы можете создать гаджет с градиентной заливкой фона используя один из фильтров Мискософт мультимедиа. В этом гаджете мы уже модифицировали стиль тэга <BODY> двумя способами:
Установили шрифт Arial , белого цвета, величиной 8 пунктов.
Добавили градиентный фильтр.
Вот код для нашего модифицированного гаджета:

И вот на что стал похож наш гаджет:
Это не искусство конечно, но все же лучше чем просто чистый белый прямоугольник пришлепнутый на панель Sidebar .
Создание гаджета типа 'Auto-Run'
Получение гаджета отображающего информацию на своем теле (в противоположность окну сообщения) это приятный шаг вперед, и лучшее понимание духа гаджетов. Однако, мы все еще вынуждены щелкать на кнопке для получения этой информации. Обязательно должен существовать способ автоматического получения и отображения информации в тот момент, когда гаджет загружается.
Вот гаджет автоматически возвращает и отображает имя установленной операционной системы, не требуя нажатия кнопки:

Как вы можете видеть, это очень похоже выглядит на наш предыдущий гаджет. Фактически здесь только два отличия:
Мы удалили кнопку из гаджета. Это означает что больше не нужно щелкать что-либо (это означает в данном случае, что теперь вообще нет нечего почему можно щелкать).
Мы добавили подпрограмму Window_OnLoad.
Как вы конечно знаете, подпрограмма Window_Onload, когда оно включена в веб-страницу, создается для запуска ее каждый раз когда веб-страница загружается или обновляется. Эта подпрограмма функционирует точно также когда она включена в гаджет: она автоматически запускается каждый раз когда гаджет загружается. Вот как мы создали самозапускающийся (auto-run) гаджет: мы прогто создали подпрограмму с именем Window_OnLoad и поместили в нее код который должен выполнятся при запуске процедуры.
Для этого гаджета наша подпрограмма Window_OnLoad выглядит так:
Sub Window_OnLoad
RunSub
End Sub
Как вы можете видеть, все что мы делаем в этой подпрограмме это вызываем вторую подпрограмму - RunSub. Обратите внимание, что мы не стали помещать наш код WMI в другую подпрограмму, мы могли бы поместить его прямо в подпрограмму Window_OnLoad и сразу вызывать в момент запуска кода. Так зачем же мы создали лишнюю подпрограмму? Все просто: это позволит нам легче перейти к следующему гаджету.
Чтобы вы могли удивляться, вот на что похож наш 'безкнопочный' гаджет.
Создание гаджета типа 'Auto-Refresh'
Несомненно, гаджеты заслуживают того, чтобы поддерживать обслуживание огромной части вещей, выступая как устройства мониторинга, покорно сохраняя таблицы чего-либо и всего, что необходимо - от количества свободного места на диске до сетевых соединений и доступной памяти. Гаджеты отлично подходят для таких задач: они малы и ненавязчивы, еще гаджеты могут непрерывно отображать визуальные сигналы которые позволяют окинуть их информацию быстрым взглядом. Также важно, что гаджеты могут быть запрограммированы на определенные действия при возникновении специфических событий. Сочетая в себе малый размер и графические возможности с вашим кодом сприпта, вы можете создавать невероятно полезные средства для мониторинга здоровья и благополучия вашей сети.
Конечно, возможность гаджета делать это в свою очередь зависит от постоянного обновления его информации. Когда гаджет запускается он может пинговать сервер и проверить его доступность. Однако, как средство мониторинга, ваш гаджет может быть использован с большим трудом, если он может пинговать сервер только в момент запуска. Вместо этого, гаджету необходимо периодически обновлять себя: повторять обновление информации через регулярные промежутки времени. Другими словами, ему необходимо делать что-то вроде этого:

Перед тем как мы обсудим то, как работает данный скрипт, мы должны заметить, что этот простой скрипт не отображает имя установленной операционной системы, вместо этого он отображает количество доступной оперативной памяти компьютера. Почему мы вдруг бросили гаджет, отображающий имя операционной системы, в пользу гаджета с оперативной памятью? Что ж, мы думаем что у вас нет необходимости постоянно отслеживать имя установленной операционной системы; можно говорить, что имя операционной системы не меняется так часто, как количество доступной памяти. Мы имеем в виду, что мониторинг доступной памяти может быть немного более реалистичным, чем мониторинг имени установленной операционной системы.
В данном случае подпрограмма для определения текущего объема доступной оперативной памяти (подпрограмма названная GetMemory) выглядит так:
Sub GetMemory
Set objLocator = CreateObject("WbemScripting.SwbemLocator")
Set objWMIService = objLocator.ConnectServer(".", "rootcimv2")
Set colItems = objWMIService.ExecQuery("Select * From Win32_OperatingSystem")
For Each objItem in colItems
DataArea.InnerHTML = objItem.FreePhysicalMemory
Next
End Sub
Однако, для нас здесь интересна не подпрограмма GetMemory , но подпрограмма Window_OnLoad:
Sub Window_Onload
GetMemory
iTimerID = window.SetInterval("GetMemory", 10000)
End Sub
Как вы можете видеть, мы делаем две вещи в этой подпрогрпмме. Во-первых, мы вызываем подпрограмму GetMemory , мы делаем это для того, чтобы быть уверенными, что при загрузке гаджета объем доступной памяти будет отображаться в нашем гаджете. Вторая вещь которую мы делаем немного более интересная:
iTimerID = window.SetInterval("GetMemory", 10000)
В данной строке кода мы используем метод SetInterval для создания таймера. Все что делает этот таймер, это вызывает подпрограмму GetMemory каждые 10 секунд (10 000 миллисекунд). Это то, как мы добивается самообновления нашего гаджета: каждые 10 секунд гаджет вызывает подпрограмму GetMemory , что означает, что каждые 10 секунд гаджет использует WMI для получения текущего количества доступной оперативной памяти и, затем, отображает эти данные в теле гаджета. Если 10 секунд между измерениями это слишком долго, тогда измените параметр 10000 на меньшее число, например, установка значения параметра 5000 будет означать, что гаджет будет обновляться каждые 5 секунд (5000 миллисекунд). Подобно этому, измените 10000 на большее число если вы предпочитаете иметь более длинный интервал между измерениями.
Вот наш гаджет в действии:
Мы никогда не говорили что это была красивая работа. Но теперь, когда вы понимаете основы создания гаджетов (в особенности, г
Обзор будущих 'вкусностей'
Для того, чтобы вы ощутили вкус того что могут делать гаджеты, вот слегка более сложный гаджет, он один делает две вещи: он отслеживает количество доступной памяти и также отображает (в веб-странице) более детальную информацию о системе когда нажата кнопка Information (Информация). Излишне говорить, что это всего лишь царапина на поверхности того, что гаджеты могут делать, но это дает вам более полное ощущение возможностей, которые могут быть включены в один единственный гаджет.
Вы можете сами разобраться в том, как и почему работает этот простой гаджет (мы уже и так вышли за рамки в этом месяце), но вот код:
