Перейти на главную страничку сайта (список статей, файлы для скачивания)

ФОРУМ (здесь можно обсудить эту статью, а также саму программу AutoHotkey и проблемы её использования)

Проект перевода документации AutoHotkey: перечень переведённых статей и статей в работе.

AutoHotkey: автоматизация приложений с Web-интерфейсом

Программа AutoHotkey предоставляет возможности автоматизации различных приложений путём вызова команд меню, нажатия на кнопки, заполнения полей ввода и т.п., о чём было рассказано в статье AutoHotkey: автоматизация приложений. Необходимую информацию для написания таких скриптов (например, идентификаторы элементов управления), как было описано в той же статье, можно получить с помощью программ Winspector и Active Window Info (AU3_Spy.exe).

Однако, например, получить идентификатор какого-нибудь поля ввода бывает не всегда так просто. Например, если вы запустите AU3_Spy.exe и попытаетесь определить ClassNN какого-либо поля ввода на открытой в Internet Explorer интернет-страничке, у вас скорее всего ничего не получится. AU3_Spy.exe будет показывать один и тот же ClassNN для всей странички, в каком бы её месте вы не находились! Важно, что подобным образом могут себя вести очень многие приложения, а не только Internet Explorer. Возможно, термин "приложения с Web-интерфейсом", употреблённый в заголовке статьи, не совсем точен, однако автор статьи надеется, что читатель уже понял, о чём речь. Для автоматизации подобных приложений с помощью AutoHotkey придётся прибегнуть к некоторым ухищрениям.

В качестве примера приведём скрипт для автоматизации приложения "Longman Dictionary", которое обладает подобным "Web-интерфейсом" и поставляется вместе с книгой. Если у вас нет этого приложения - ничего страшного! Цель данной статьи - показать принцип написания подобных скриптов, который будет понятен из последующих пояснений.

Суть задачи:

Текст скрипта:

^!INSERT::
Clipboard =
Send, ^c
ClipWait, 1
if ErrorLevel <> 0
{
	MsgBox, Попытка скопировать текст в буфер обмена неудачна.
	Return
}
Txt = %Clipboard%
IfWinNotExist, Longman Dictionary of Contemporary English UPDATED EDITION
{
	Run, "C:\Program Files\Longman\ldoce4v2\ldoce4.exe"
	WinWait, Longman Dictionary of Contemporary English UPDATED EDITION,, 15
}
WinActivate, Longman Dictionary of Contemporary English UPDATED EDITION
IfWinActive, Longman Dictionary of Contemporary English UPDATED EDITION
{
	ControlFocus, ldoce4v2WindowClass88, Longman Dictionary of Contemporary English UPDATED EDITION
	ControlFocus, ldoce4v2WindowClass3, Longman Dictionary of Contemporary English UPDATED EDITION
	Send, {TAB}{TAB}%Txt%+{HOME}{ENTER}
}
Return

Скрипт содержит единственную горячую клавишу Ctrl+Alt+Insert, по нажатию которой и выполняются все необходимые действия. Разберём построчно работу скрипта.

  1. Вторая строка скрипта
    Clipboard =
    
    очищает буфер обмена.
  2. Третья строка скрипта
    Send, ^c
    
    посылает активному окну нажатие Ctrl+C, что должно привести к копированию выделенного слова в буфер обмена (подразумевается, что слово уже выделено пользователем; даже если это не так, ничего страшного не произойдёт, что будет видно из дальнейшего).
  3. Четвёртая строка скрипта
    ClipWait, 1
    
    ожидает появления данных в буфере обмена в течение одной секунды.
  4. Строки скрипта с пятой по девятую
    if ErrorLevel <> 0
    {
    	MsgBox, Попытка скопировать текст в буфер обмена неудачна.
    	Return
    }
    
    проверяют, появились ли данные в буфере обмена. Если это не так, выдаётся предупреждающее сообщение, и скрипт завершает работу.
  5. Десятая строка скрипта
    Txt = %Clipboard%
    
    копирует содержимое буфера обмена в переменную Txt для дальнейшей работы.
  6. Строки скрипта с одиннадцатой по пятнадцатую
    IfWinNotExist, Longman Dictionary of Contemporary English UPDATED EDITION
    {
    	Run, "C:\Program Files\Longman\ldoce4v2\ldoce4.exe"
    	WinWait, Longman Dictionary of Contemporary English UPDATED EDITION,, 15
    }
    
    проверяют существование окна приложения "Longman Dictionary". Если такого окна нет, приложение запускается, а затем происходит ожидание появления главного окна приложения в течение 15 секунд.
  7. Шестнадцатая строка скрипта
    WinActivate, Longman Dictionary of Contemporary English UPDATED EDITION
    
    делает окно приложения "Longman Dictionary" активным.
  8. И наконец, строки скрипта с семнадцатой по двадцать первую
    IfWinActive, Longman Dictionary of Contemporary English UPDATED EDITION
    {
    	ControlFocus, ldoce4v2WindowClass88, Longman Dictionary of Contemporary English UPDATED EDITION
    	ControlFocus, ldoce4v2WindowClass3, Longman Dictionary of Contemporary English UPDATED EDITION
    	Send, {TAB}{TAB}%Txt%+{HOME}{ENTER}
    }
    
    и выполняют нужные нам действия, если окно приложения "Longman Dictionary" активно. Вначале передаётся фокус элементу управления, который имеет ClassNN "ldoce4v2WindowClass88". Этот элемент управления содержит (или будет содержать) словарную статью. Затем фокус передаётся элементу управления, который имеет ClassNN "ldoce4v2WindowClass3". Этот элемент управления содержит поле ввода для набора искомого слова, кнопку "ОК" и некоторые другие кнопки. Проблема, которую мы сейчас пытаемся обойти, состоит именно в том, что все эти кнопки и поле ввода, до которых мы хотим добраться, имеют "общий" ClassNN "ldoce4v2WindowClass3". Затем посылаются нажатия клавиш:
    Send, {TAB}{TAB}%Txt%+{HOME}{ENTER}
    
    Первые два нажатия Tab обеспечивают фокус ввода в нужном нам поле ввода. Поскольку переменная %Txt% содержит выделенное пользователем слово (взятое нами ранее из буфера обмена), упоминание %Txt% в команде Send приводит к набору этого слова в поле ввода, где сейчас находится фокус. Нажатие Shift+Home приводит к выделению только что набранного слова. И наконец, нажатие Enter, эквивалентное в данном случае нажатию кнопки "ОК", запускает поиск и отображение словарной статьи.

Теперь некоторые важные пояснения.

Нажатие Shift+Home для выделения только что набранного слова необходимо для последующих вызовов скрипта, поскольку мы не очищаем содержимое поля ввода. Такое выделение позволит напечатать нам следующее слово при следующем вызове скрипта "поверх" ранее набранного слова. Если этого не сделать, при многократных вызовах скрипта слова будут "накапливаться" в поле ввода, печатаясь друг за другом.

Для чего нужна предварительная передача фокуса элементу управления, который содержит словарную статью и имеет ClassNN "ldoce4v2WindowClass88"? Дело в том, что несмотря на то, что наше поле ввода и ряд кнопок имеют общий ClassNN "ldoce4v2WindowClass3", они подвергаются интерактивной табуляции "внутри" этого элемента управления не хуже, чем любые "настоящие" элементы управления. Когда мы посылаем командой Send двойное нажатие Tab, мы должны быть уверены, что фокус ввода находится внутри элемента "ldoce4v2WindowClass3" именно там, где надо, иначе мы можем "промахнуться" мимо нужного нам поля ввода, нажимая Tab'ы. Предварительная передача фокуса словарной статье (ldoce4v2WindowClass88) позволяет быть уверенным в этом, т.к. при передаче фокуса элементу ldoce4v2WindowClass3 с какого-либо другого элемента управления "фактический" фокус оказывается всегда в одном и том же месте, а именно - в двух Tab'ах от нужного нам поля ввода. В отличие от этого, при передаче фокуса элементу ldoce4v2WindowClass3 "просто так", без предварительного отсыла на другой элемент управления, "фактический" фокус окажется там, где он был при последнем обращении к программе, т.е. где угодно, а вовсе не в двух Tab'ах от нужного нам поля ввода. Таким образом, если убрать вызов

ControlFocus, ldoce4v2WindowClass88, Longman Dictionary of Contemporary English UPDATED EDITION
скрипт сработает правильно только при первом запуске "Longman Dictionary".

Перейти на главную страничку сайта (список статей, файлы для скачивания)

© 2007 http://www.script-coding.com При любом использовании материалов сайта обязательна ссылка на него как на источник информации, а также сохранение целостности и авторства материалов.