Вопрос по лекции 7, где рассматривается взаимодействие со сторонними программами, в том числе эмуляция нажатия кнопок клавиатуры WshShell.SendKeys. Вопрос в том что во время автоматизации может потребоваться не нажатие клавиатуры, а нажатие кнопок в сообщениях этих программ. Можно вытащить информацию о объекте (кнопке) скажем с помощью AutoIt Info, или ориентироваться скажем на текст на кнопке..., но как на эту кнопку нажать? (без обхода по клавиатуре) |
WSH как средство взаимодействия с внешними программами
Использование внешних серверов автоматизации
Одна из наиболее полезных возможностей сценариев WSH – управление работой внешних серверов автоматизации (программ, предоставляющих свои службы и интерфейсы для использования другими приложениями). Самые распространенные и часто используемые серверы автоматизации в Windows – это приложения пакета Microsoft Office. Мы рассмотрим на примерах, каким образом можно выводить из сценариев WSH информацию в две наиболее распространенные программы этого пакета: Microsoft Word и Microsoft Excel.
Объектные модели Microsoft Word и Excel
Для того, чтобы использовать из сценариев WSH те возможности, которые поддерживают программы Word и Excel, необходимо знать, какие именно объекты предоставляются для внешнего использования этими серверами автоматизации и как объекты соотносятся друг с другом. Хотя объектные модели различных приложений Microsoft Office довольно сложны, они похожи друг на друга, причем для практических целей достаточно понять принцип работы с несколькими ключевыми объектами. Здесь мы не будем останавливаться на подробном рассмотрении свойств и методов объектов Word и Excel, а лишь кратко упомянем, какие именно объекты будут использоваться в рассмотренных ниже примерах сценариев.
На самом верхнем уровне объектной модели Word находится объект Application, который представляет непосредственно само приложение Word и содержит (в качестве свойств) все остальные объекты. Таким образом, объект Application используется для получения доступа к любому другому объекту Word.
Семейство Documents является свойством объекта Application и содержит набор объектов Document, каждый из которых соответствует открытому в Word документу. Класс Documents понадобится нам в сценариях для создания новых документов. Объект Document содержит в качестве своих свойств семейства различных объектов документа: символов (Characters), слов (Words), предложений (Sentences), параграфов (Paragraphs), закладок (Bookmarks) и т.д.
Объект Selection позволяет работать с выделенным фрагментом текста (этот фрагмент может быть и пустым). Таким образом, можно сказать, что объект Selection открывает путь в документ, так как он предоставляет доступ к выделенному фрагменту документа. В частности, у объекта Selection имеется метод TypeText(Text), с помощью которого можно вставлять текст в документ. Используя свойства этого объекта (которые, в свою очередь, могут являться объектами со своими свойствами), можно управлять параметрами выделенного фрагмента, например, устанавливать нужный размер и гарнитуру шрифта, выравнивать параграфы по центру и т.п.
Объектная модель Excel построена по тому же принципу, что и объектная модель Word. Основным объектом, содержащим все остальные, является Application. Напомним, что отдельные файлы в Excel называются рабочими книгами. Семейство Workbooks в Excel является аналогом семейства Documents в Word и содержит набор объектов Workbook (аналог объекта Document в Word), каждый из которых соответствует открытой в Excel рабочей книге. Новая рабочая книга создается с помощью метода Add() объекта Workbooks.
Для доступа к ячейкам активного рабочего листа Excel используется свойство Cells объекта Application. Для получения или изменения значения отдельной ячейки применяется конструкция Cells(row,column).Value, где row и column являются соответственно номерами строки и столбца, на пересечении которых находится данная ячейка.
В Excel, как и в Word, имеется объект Selection, позволяющий работать с выделенным фрагментом электронной таблицы. Самым простым способом выделить диапазон ячеек активного рабочего листа является использование метода Select() объекта Range. Например, выражение Range("A1:C1").Select() позволяет выделить три смежные ячейки: "A1", "B1" и "C1".
Для того, чтобы понять, какой именно объект Word или Excel нужно использовать для решения той или иной задачи, часто проще всего бывает проделать в соответствующем приложении необходимые манипуляции вручную, включив предварительно режим записи макроса. В результате мы получим текст макроса на языке VBA (Visual Basic for Applications), из которого будет ясно, какие методы и с какими параметрами нужно вызывать и какие значения нужно присваивать свойствам объектов. В качестве простой иллюстрации проделаем следующие действия. Запустим Word, запустим Macro Recorder (Сервис|Макрос|Начать запись… (Tools|Macros|Record…)), назовем новый макрос "Пример1" и нажмем на кнопку "Ok". После этого напишем в документе слово "Пример" и прекратим запись макроса. Теперь можно посмотреть содержимое записанного макроса. Для этого нужно выбрать пункт Макросы… (Macroses…) в меню Сервис|Макрос (Tools|Macros), выделить макрос "Пример1" в списке всех доступных макросов и нажать кнопку Изменить (Edit). В открывшемся окне редактора Visual Basic появится текст макроса:
Sub Пример1() ' ' Пример1 Макрос ' Макрос записан 12.09.07 Андрей Владимирович Попов ' Selection.TypeText Text:="Пример" End Sub
Как мы видим, для печати слова в документе был использован метод TypeText объекта Selection.
Макросы в Excel записываются и редактируются аналогичным образом.
Взаимодействие с Microsoft Word
Для того чтобы из сценария получить доступ к свойствам или методам внешнего сервера автоматизации, вначале надо "создать" соответствующий объект, т. е. загрузить в память экземпляр нужного COM-объекта и сохранить в переменной ссылку на этот объект. Объект в сценарии может создаваться несколькими способами:
- с помощью метода CreateObject объекта WScript (объектная модель WSH);
- с помощью конструкции New ActiveXObject (язык JScript);
- с помощью функции CreateObject (язык VBScript).
В любом случае в используемый метод или функцию в качестве параметра передается программный идентификатор объекта ( ProgID ), заключенный в скобки. Пример на языке VBScript:
Set WA=WScript.CreateObject("Word.Application")
Перед точкой в ProgID стоит имя библиотеки типов (type library) для объекта, которая может существовать как в виде отдельного файла с расширением tlb, так и в виде части файла с исполняемым кодом объекта (библиотека типов, содержащая сведения о COM-объекте, регистрируется в системном реестре при установке приложения, использующего этот объект). После точки в ProgID указывается имя класса, содержащего свойства и методы, доступные для использования другими приложениями.
Выполняя метод CreateObject, интерпретатор сценария через ProgID получает из системного реестра путь к файлам нужной библиотеки типов. Затем с помощью этой библиотеки в память загружается экземпляр запрашиваемого объекта, и его интерфейсы становятся доступными для использования в сценарии. Ссылка на созданный объект сохраняется в переменной; в дальнейшем, используя эту переменную, мы получаем доступ к свойствам и методам объекта, а также к его вложенным объектам (если они имеются).
Примеры управления приложением Microsoft Word из сценариев приведен в листинге 7.6. Сначала создается главный объект Word.Application, который запускает приложение Microsoft Word:
Set WA=WScript.CreateObject("Word.Application")
Затем создается новый пустой документ, в результате в переменную WD заносится ссылка на объект Document:
Set WD=WA.Documents.Add()
Наконец, в переменную Sel заносится ссылка на объект Selection, с помощью которого можно задать тип и размер шрифта, тип выравнивания абзацев и напечатать в документе строки текста:
Set Sel=WA.Selection;
В результате выполнения сценария PrintInWord.vbs в новом документе Microsoft Word печатаются две строки текста, после чего с помощью метода PrintOut объекта Document содержимое документа выводится на принтер:
WD.PrintOut();
'******************************************************************* ' Имя: PrintInWord.vbs ' Язык: VBScript ' Описание: Использование из сценария внешнего объекта ' автоматизации (Microsoft Word) '******************************************************************* Option Explicit Dim WA,WD,Sel ' Объявляем переменные 'Создаем объект¬–приложение Microsoft Word Set WA=WScript.CreateObject("Word.Application") ' Можно было использовать конструкцию ' Set WA=CreateObject("Word.Application") Set WD=WA.Documents.Add 'Создаем новый документ (объект Document) WA.Visible=true ' Делаем Word видимым Set Sel=WA.Selection 'Создаем объект Selection Sel.Font.Size=14 'Устанавливаем размер шрифта Sel.ParagraphFormat.Alignment=1 'Выравнивание по центру Sel.Font.Bold=true 'Устанавливаем полужирный шрифт Sel.TypeText "Привет!" & vbCrLf 'Печатаем строку текста Sel.Font.Bold=false 'Отменяем полужирный шрифт Sel.ParagraphFormat.Alignment=0 'Выравнивание по левому краю 'Печатаем строку текста Sel.TypeText "Эти строки напечатаны с помощью WSH." WD.PrintOut 'Выводим документ на принтер '************* Конец *********************************************Листинг 7.6. Использование сервера автоматизации Microsoft Word (VBScript)
Взаимодействие с Microsoft Excel
В качестве примера управления сервером автоматизации Microsoft Excel рассмотрим сценарий PrintInExcel.vbs (листинг 7.7). Как и в случае с Microsoft Word, здесь сначала создается главный объект Excel.Application, который запускает приложение Microsoft Excel:
Set XL=WScript.CreateObject("Excel.Application")
Затем открывается новая рабочая книга:
XL.WorkBooks.Add
Ширина первого и второго столбца делается равной 40 пунктам, а третьей – 10 пунктам:
'Устанавливаем нужную ширину колонок XL.Columns(1).ColumnWidth = 40 XL.Columns(2).ColumnWidth = 40 XL.Columns(3).ColumnWidth = 10
В столбцы первой строки записываются обозначения столбцов ("Фамилия", "Имя", "Телефон"), причем данный текст выделяется полужирным шрифтом:
'Печатаем в ячейки текст XL.Cells(1,1).Value="Фамилия" XL.Cells(1,2).Value="Имя" XL.Cells(1,3).Value="Телефон" 'Выделяем три ячейки XL.Range("A1:C1").Select 'Устанавливаем полужирный текст для выделенного диапазона XL.Selection.Font.Bold = true Во вторую строку заносятся данные для каждого столбца: 'Печатаем в ячейки текст XL.Cells(2,1).Value="Иванов" XL.Cells(2,2).Value="Иван" XL.Cells(2,3).Value="555555"
'******************************************************************* ' Имя: PrintInExcel.vbs ' Язык: VBScript ' Описание: Использование из сценария внешнего объекта ' автоматизации (Microsoft Excel) '******************************************************************* Option Explicit Dim XL ' Объявляем переменные 'Создаем объект-приложение Microsoft Excel Set XL=WScript.CreateObject("Excel.Application") 'Делаем окно Microsoft Excel видимым XL.Visible=true 'Открываем новую рабочую книгу XL.WorkBooks.Add 'Устанавливаем нужную ширину колонок XL.Columns(1).ColumnWidth = 40 XL.Columns(2).ColumnWidth = 40 XL.Columns(3).ColumnWidth = 10 'Печатаем в ячейки текст XL.Cells(1,1).Value="Фамилия" XL.Cells(1,2).Value="Имя" XL.Cells(1,3).Value="Телефон" 'Выделяем три ячейки XL.Range("A1:C1").Select 'Устанавливаем полужирный текст для выделенного диапазона XL.Selection.Font.Bold = true 'Печатаем в ячейки текст XL.Cells(2,1).Value="Иванов" XL.Cells(2,2).Value="Иван" XL.Cells(2,3).Value="555555" '************* Конец *********************************************Листинг 7.7. Использование сервера автоматизации Microsoft Excel (VBScript)