Вопрос по лекции 7, где рассматривается взаимодействие со сторонними программами, в том числе эмуляция нажатия кнопок клавиатуры WshShell.SendKeys. Вопрос в том что во время автоматизации может потребоваться не нажатие клавиатуры, а нажатие кнопок в сообщениях этих программ. Можно вытащить информацию о объекте (кнопке) скажем с помощью AutoIt Info, или ориентироваться скажем на текст на кнопке..., но как на эту кнопку нажать? (без обхода по клавиатуре) |
WSH как средство взаимодействия с внешними программами
WSH как средство взаимодействия с внешними программами
Сценарии WSH способны запускать другие графические или консольные приложения, причем в последнем случае запущенный процесс может функционировать как дочерний, что позволяет в сценарии-родителе работать с информацией из его входного или выходного потока.
Запуск приложений Windows
Из сценария WSH запустить другое приложение можно с помощью методов Run или Exec объекта WshShell.
При использовании метода Run для запускаемого приложения можно задать тип окна (при условии, что приложение поддерживает этот тип). Например, в результате выполнения следующих двух строк VBScript-кода:
Set WshShell = WScript.CreateObject("WScript.Shell") WshShell.Run "notepad",3
программа Блокнот (notepad.exe) будет запущена в максимизированном (развернутом на весь экран) окне.
Замечание
Метод Run всегда создает новый экземпляр запускаемого процесса, с его помощью нельзя ни повторно активизировать окно запущенного приложения (для этого используется метод AppActivate ), ни свернуть или развернуть его.
Другим вариантом запуска из сценария приложения Windows, является применение метода Exec. Этот метод запускает приложение, путь к которому указан как параметр метода, и возвращает объект WshScriptExec. Например:
Set WshShell = WScript.CreateObject("WScript.Shell") Set theNotepad = WshShell.Exec("notepad")
Замечание
При подобном запуске приложения, в отличие от метода Run, нельзя задать тип окна.
Объект WshScriptExec позволяет контролировать ход выполнения запущенного приложения с помощью свойства Status — если Status равен 0, то приложение выполняется, если Status равен 1, то приложение завершено. Кроме этого, используя метод Terminate, можно принудительно завершить работу того приложения, которому соответствует объект WshScriptExec.
В листинге 7.1 приведен сценарий на языке VBScipt, в котором с помощью метода Exec запускается Блокнот (notepad.exe); ссылка на соответствующий объект WshScriptExec сохраняется в переменной theNotepad:
Set theNotepad = WshShell.Exec("notepad")
После этого выполнение сценария приостанавливается на полсекунды (пауза необходима, для того чтобы окно Блокнота успело появиться на экране), после чего выводится диалоговое окно с информацией о статусе запущенного приложения и вопросом о необходимости закрытия Блокнота. В случае утвердительного ответа происходит закрытие Блокнота с помощью метода Terminate.
'******************************************************************* ' Имя: ExecWinApp.vbs ' Язык: VBScript ' Описание: Запуск и закрытие приложение (объект WshScriptExec) '******************************************************************* Option Explicit Dim WshShell,theNotepad,Res,Text,Title ' Объявляем переменные ' Создаем объект WshShell Set WshShell = WScript.CreateObject("WScript.Shell") WScript.Echo "Запускаем Блокнот" ' Запускаем приложение (создаем объект WshScriptExec) Set theNotepad = WshShell.Exec("notepad") WScript.Sleep 500 ' Приостанавливаем выполнение сценария Text="Блокнот запущен (Status=" & theNotepad.Status & ")" & vbCrLf _ & "Закрыть Блокнот?" Title="" ' Выводим диалоговое окно на экран Res=WshShell.Popup(Text,0,Title,vbQuestion+vbYesNo) ' Определяем, какая кнопка нажата в диалоговом окне If Res=vbYes Then theNotepad.Terminate ' Прерываем работу Блокнота ' Приостанавливаем выполнение сценария, для того чтобы Блокнот ' успел закрыться WScript.Sleep 100 WScript.Echo "Блокнот закрыт (Status=" & theNotepad.Status & ")" End If '************* Конец *********************************************/Листинг 7.1. Запуск и принудительное закрытие приложения (VBScript)
Переключение между приложениями, имитация нажатий клавиш
Производить переключение между окнами нескольких запущенных приложений позволяет метод AppActivate объекта WshShell. В качестве аргумента этого метода нужно указывать либо заголовок активизируемого окна, либо идентификатор процесса (Process ID, PID), который запущен в данном окне. Предпочтительным является использование PID, получаемого с помощью свойства ProcessID объекта WshScriptExec, соответствующего активизируемому приложению. Недостатки применения заголовка окна в методе AppActivate:
- при написании сценария необходимо знать точное название заголовка;
- само приложение может изменить текст в заголовке окна;
- в случае нескольких окон с одинаковыми заголовками AppActivate всегда будет активизировать один и тот же экземпляр, доступ к другим окнам получить не удастся.
Активизировав то или иное окно, в котором выполняется приложение Windows, можно из сценария сымитировать нажатия клавиш в этом окне. Для этого используется метод SendKeys объекта WshShell.
Рассмотрим пример сценария Run&ExecWinApp.vbs (листинг 7.2), в котором запускается Калькулятор (calc.exe) и в его окно с помощью SendKeys последовательно посылаются нажатия клавиш <1>, <+>, <2> и <Enter>:
Set theCalculator = WshShell.Exec("calc") WScript.Sleep 500 WshShell.AppActivate theCalculator.ProcessID WshShell.SendKeys "1{+}" WshShell.SendKeys "2" WshShell.SendKeys "~" ' Клавиша <Enter>
Затем выполнение сценария приостанавливается на 1 секунду, чтобы результат вычислений был виден на экране и результат вычислений (символ "3") копируется в буфер Windows с помощью "нажатия" клавиш <Ctrl>+<C>:
WshShell.SendKeys "^c"
После этого на экран выводится сообщение о том, что Калькулятор будет закрыт, в результате чего окно Калькулятора теряет фокус. Для того чтобы вновь активизировать это окно, используется метод AppActivate, параметром которого служит PID Калькулятора:
WshShell.AppActivate theCalculator.ProcessID
Для того чтобы закрыть окно Калькулятора, в него посылаются нажатия клавиш <Alt>+<F4>:
WshShell.SendKeys "%{F4}"
После закрытия Калькулятора запускается Блокнот (notepad.exe) и в него записываются результаты работы Калькулятора (вставка из буфера вычисленной суммы производится с помощью "нажатий" <Ctrl>+<V>):
WshShell.Run "notepad" WScript.Sleep 1000 WshShell.AppActivate "notepad" WshShell.SendKeys "1{+}2=" WshShell.SendKeys "^v" WshShell.SendKeys " {(}c{)} Calculator"
'******************************************************************* ' Имя: Run&ExecWinApp.vbs ' Язык: VBScript ' Описание: Запуск двух приложений и обмен данными между ними '******************************************************************* Option Explicit Dim WshShell, theCalculator ' Объявляем переменные ' Создаем объект WshShell Set WshShell = WScript.CreateObject("WScript.Shell") WScript.Echo("Запускаем калькулятор и" & vbCrLf & "считаем 1+2") ' Создаем объект WshScript (запускаем Калькулятор) Set theCalculator = WshShell.Exec("calc") ' Приостанавливаем выполнение сценария, для того чтобы ' окно Калькулятора успело появиться на экране WScript.Sleep 500 ' Активизируем окно Калькулятора WshShell.AppActivate theCalculator.ProcessID ' Посылаем нажатия клавиш в окно Калькулятора WshShell.SendKeys "1{+}" WshShell.SendKeys "2" WshShell.SendKeys "~" ' Клавиша <Enter> WScript.Sleep 500 ' Копируем результат вычисления в буфер Windows (<Ctrl>+C) WshShell.SendKeys "^c" ' Выводим сообщение (активное окно меняется) WScript.Echo "Закрываем калькулятор" ' Активизируем окно Калькулятора WshShell.AppActivate theCalculator.ProcessID ' Закрываем окно Калькулятора (<Alt>+<F4>) WshShell.SendKeys "%{F4}" WScript.Echo "Запускаем Блокнот и копируем туда результат" WshShell.Run "notepad" ' Запускаем Блокнот ' Приостанавливаем выполнение сценария, для того чтобы ' окно Блокнота успело появиться на экране WScript.Sleep 1000 WshShell.AppActivate "notepad" ' Активизируем окно Блокнота ' Посылаем нажатия клавиш в окно Блокнота WshShell.SendKeys "1{+}2=" ' Вставляем содержимое буфера Windows (<Ctrl>+V) WshShell.SendKeys "^v" ' Выводим в окно Блокнота оставшуюся информацию WshShell.SendKeys " {(}c{)} Calculator" '************* Конец *********************************************Листинг 7.2. Запуск двух приложений и обмен данными между ними (VBScript)