Перейти на главную страничку сайта (список статей, файлы для скачивания)
Проект перевода документации AutoHotkey: перечень переведённых статей и статей в работе.
Программа 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, по нажатию которой и выполняются все необходимые действия. Разберём построчно работу скрипта.
Clipboard =очищает буфер обмена.
Send, ^cпосылает активному окну нажатие Ctrl+C, что должно привести к копированию выделенного слова в буфер обмена (подразумевается, что слово уже выделено пользователем; даже если это не так, ничего страшного не произойдёт, что будет видно из дальнейшего).
ClipWait, 1ожидает появления данных в буфере обмена в течение одной секунды.
if ErrorLevel <> 0 { MsgBox, Попытка скопировать текст в буфер обмена неудачна. Return }проверяют, появились ли данные в буфере обмена. Если это не так, выдаётся предупреждающее сообщение, и скрипт завершает работу.
Txt = %Clipboard%копирует содержимое буфера обмена в переменную Txt для дальнейшей работы.
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 секунд.
WinActivate, Longman Dictionary of Contemporary English UPDATED EDITIONделает окно приложения "Longman Dictionary" активным.
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 При любом использовании материалов сайта обязательна ссылка на него как на источник информации, а также сохранение целостности и авторства материалов.