Вопрос по лекции 7, где рассматривается взаимодействие со сторонними программами, в том числе эмуляция нажатия кнопок клавиатуры WshShell.SendKeys. Вопрос в том что во время автоматизации может потребоваться не нажатие клавиатуры, а нажатие кнопок в сообщениях этих программ. Можно вытащить информацию о объекте (кнопке) скажем с помощью AutoIt Info, или ориентироваться скажем на текст на кнопке..., но как на эту кнопку нажать? (без обхода по клавиатуре) |
Собственная объектная модель WSH
Методы объекта WScript
Объект WScript имеет несколько методов, которые описаны в табл. 5.3.
Метод | Описание |
---|---|
CreateObject(strProgID [, strPrefix]) | Создает объект, заданный параметром strProgID |
ConnectObject(strObject, strPrefix) | Устанавливает соединение с объектом strObject, позволяющее писать функции-обработчики его событий (имена этих функций должны начинаться с префикса strPrefix ) |
DisconnectObject(obj) | Отсоединяет объект obj, связь с которым была предварительно установлена в сценарии |
Echo([Arg1] [, Arg2] [,…]) | Выводит текстовую информацию на консоль или в диалоговое окно |
GetObject(strPathname [, strProgID], [strPrefix]) | Активизирует объект автоматизации, определяемый заданным файлом (параметр strPathName ) или объект, заданный параметром strProgID |
Quit([intErrorCode]) | Прерывает выполнение сценария с заданным параметром intErrorCode кодом выхода. Если параметр intErrorCode не задан, то объект WScript установит код выхода равным нулю |
Sleep(intTime) | Приостанавливает выполнения сценария (переводит его в неактивное состояние) на заданное параметром intTime число миллисекунд |
Приведем дополнительные пояснения и примеры использования для методов, приведенных в табл. 5.3.
Метод CreateObject
Строковый параметр strProgID, указываемый в методе CreateObject, называется программным идентификатором объекта (Programmic Identifier, ProgID).
Если указан необязательный параметр strPrefix, то после создания объекта в сценарии можно обрабатывать события, возникающие в этом объекте (естественно, если объект предоставляет интерфейсы для связи с этими событиями). Когда объект сообщает о возникновении определенного события, сервер сценариев вызывает функцию, имя которой состоит из префикса strPrefix и имени этого события. Например, если в качестве strPrefix указано "MYOBJ_", а объект сообщает о возникновении события "OnBegin," то будет запущена функция "MYOBJ_OnBegin", которая должна быть описана в сценарии.
В следующем примере метод CreateObject используется для создания объекта WshNetwork:
var WshNetwork = WScript.CreateObject("WScript.Network");
Отметим, что объекты автоматизации из сценариев можно создавать и без помощи WSH. В JScript для этого используется объект ActiveXObject, например:
var WshNetwork = new ActiveXObject("WScript.Network");
В VBScript для создания объектов может использоваться специальная функция CreateObject, например:
Set WshNetwork = CreateObject("WScript.Network")
Однако организовать в сценарии обработку событий создаваемого объекта можно только при использовании метода WScript.CreateObject.
Метод ConnectObject
Объект, соединение с которым осуществляется с помощью метода ConnectObject, должен предоставлять интерфейс к своим событиям.
В следующем примере в переменной MyObject создается абстрактный объект "SomeObject", затем из сценария вызывается метод SomeMetod этого объекта. После этого устанавливается связь с переменной MyObject и задается префикс "MyEvent" для процедур обработки события этого объекта. Если в объекте возникнет событие с именем "Event", то будет вызвана функция MyEvent_Event. Метод DisconnectObject объекта WScript производит отсоединение объекта MyObject.
var MyObject = WScript.CreateObject("SomeObject"); MyObject.SomeMethod(); WScript.ConnectObject(MyObject,"MyEvent"); function MyEvent_Event(strName){ WScript.Echo(strName); } WScript.DisconnectObject(MyObject);
Метод Echo
Параметры Arg1, Arg2, … метода Echo задают аргументы для вывода. Если сценарий был запущен с помощью wscript.exe, то метод Echo направляет вывод в диалоговое окно, если же для выполнения сценария применяется cscript.exe, то вывод будет направлен на экран (консоль). Каждый из аргументов при выводе будет разделен пробелом. В случае использования cscript.exe вывод всех аргументов будет завершен символом новой строки. Если в методе Echo не задан ни один аргумент, то будет напечатана пустая строка.
Например, после выполнения сценария EchoExample.vbs (листинг 5.3) с помощью cscript.exe на экран будут выведены пустая строка, три числа и строка текста.
'******************************************************************* '* Имя: EchoExample.vbs '* Язык: VBScript '* Описание: Использование метода WScript.Echo '******************************************************************* WScript.Echo 'Выводим пустую строку WScript.Echo 1,2,3 'Выводим числа WScript.Echo "Привет!" 'Выводим строку '************* Конец *********************************************Листинг 5.3. Использование метода WScript.Echo
Метод Sleep
В следующем примере сценарий переводится в неактивное состояние на 5 секунд:
'******************************************************************* '* Имя: SleepExample.vbs '* Язык: VBScript '* Описание: Использование метода WScript.Sleep '******************************************************************* WScript.Echo "Сценарий запущен, отдыхаем…" WScript.Sleep 5000 WScript.Echo "Выполнение сценария завершено" '************* Конец *********************************************Листинг 5.4. Использование метода WScript.Sleep
Метод Sleep необходимо применять при асинхронной работе сценария и какой-либо другой задачи, например, при имитации нажатий клавиш в активном окне с помощью метода WshShell.SendKeys.
Объект WshShell
С помощью объекта WshShell можно запускать новый процесс, создавать ярлыки, работать с системным реестром, получать доступ к переменным среды и специальным папкам Windows. Создается этот объект следующим образом:
var WshShell=WScript.CreateObject("WScript.Shell");
Объект WshShell имеет три свойства, которые приведены в табл. 5.4.
Свойство | Описание |
---|---|
CurrentDirectory | Здесь хранится полный путь к текущему каталогу (к каталогу, из которого был запущен сценарий) |
Environment | Содержит объект WshEnvironment, который обеспечивает доступ к переменным среды операционной системы для Windows NT/2000/XP или к переменным среды текущего командного окна для Windows 9x |
SpecialFolders | Содержит объект WshSpecialFolders для доступа к специальным папкам Windows (рабочий стол, меню Пуск (Start) и т. д.) |
Опишем теперь методы, имеющиеся у объекта WshShell (табл. 5.5).
Метод | Описание |
---|---|
AppActivate(title) | Активизирует заданное параметром title окно приложения. Строка title задает название окна (например, "calc" или "notepad" ) или идентификатор процесса ( Process ID, PID ) |
CreateShortcut(strPathname) | Создает объект WshShortcut для связи с ярлыком Windows (расширение lnk) или объект WshUrlShortcut для связи с сетевым ярлыком (расширение url). Параметр strPathname задает полный путь к создаваемому или изменяемому ярлыку |
Environment(strType) | Возвращает объект WshEnvironment, содержащий переменные среды заданного вида |
Exec(strCommand) | Создает новый дочерний процесс, который запускает консольное приложение, заданное параметром strCommand. В результате возвращается объект WshScriptExec, позволяющий контролировать ход выполнения запущенного приложения и обеспечивающий доступ к потокам StdIn, StdOut и StdErr этого приложения |
ExpandEnvironmentStrings(strString) | Возвращает значение переменной среды текущего командного окна, заданной строкой strString (имя переменной должно быть окружено знаками "%" ) |
LogEvent(intType, strMessage [,strTarget]) | Протоколирует события в журнале Windows NT/2000/XP или в файле WSH.log. Целочисленный параметр intType определяет тип сообщения, строка strMessage — текст сообщения. Параметр strTarget может задаваться только в Windows NT/2000/XP, он определяет название системы, в которой протоколируются события (по умолчанию это локальная система). Метод LogEvent возвращает true, если событие записано успешно и false в противном случае |
Popup(strText,[nSecToWait], [strTitle], [nType]) | Выводит на экран информационное окно с сообщением, заданным параметром strText. Параметр nSecToWait задает количество секунд, по истечении которых окно будет автоматически закрыто, параметр strTitle определяет заголовок окна, параметр nType указывает тип кнопок и значка для окна |
RegDelete(strName) | Удаляет из системного реестра заданный параметр или раздел целиком |
RegRead(strName) | Возвращает значение параметра реестра или значение по умолчанию для раздела реестра |
RegWrite(strName, anyValue [,strType]) | Записывает в реестр значение заданного параметра или значение по умолчанию для раздела |
Run(strCommand, [intWindowStyle], [bWaitOnReturn]) | Создает новый независимый процесс, который запускает приложение, заданное параметром strCommand |
SendKeys(string) | Посылает одно или несколько нажатий клавиш в активное окно (эффект тот же, как если бы вы нажимали эти клавиши на клавиатуре) |
SpecialFolders(strSpecFolder) | Возвращает строку, содержащую путь к специальной папке Windows, заданной параметром strSpecFolder |
Рассмотрим более подробно некоторые методы, приведенные в табл. 5.5.
Метод CreateShortcut
Этот метод позволяет создать новый или открыть уже существующий ярлык для изменения его свойств.
Приведем пример сценария, в котором создаются два ярлыка — на сам выполняемый сценарий (объект oShellLink ) и на сетевой ресурс ( oUrlLink ).
'***************************************************************** '* Имя: MakeShortcuts.vbs '* Язык: VBScript '* Описание: Создание ярлыков из сценария '***************************************************************** Dim WshShell,oShellLink,oUrlLink ' Создаем объект WshShell Set WshShell=WScript.CreateObject("WScript.Shell") ' Создаем ярлык на файл Set oShellLink=WshShell.CreateShortcut("Current Script.lnk") ' Устанавливаем путь к файлу oShellLink.TargetPath=WScript.ScriptFullName ' Сохраняем ярлык oShellLink.Save ' Создаем ярлык на сетевой ресурс Set oUrlLink = WshShell.CreateShortcut("Microsoft Web Site.URL") ' Устанавливаем URL oUrlLink.TargetPath = "http://www.microsoft.com" ' Сохраняем ярлык oUrlLink.Save '************* Конец *********************************************Листинг 5.5. Создание ярлыков из сценария (VBScript)