вторник, 18 августа 2009 г.

Скрипт на AutoIt 3 Копирование текста диалогового окна в блокнот

Наконец то я смог написать постой пример на AutoIt
Задача которую я сегодня реализую, будет очень простой, любое появившееся диалоговое окно, должно быть записано в блокнот.
Далее приведу пример кода, и разберу его.

Начнём с того как создать пустой скрипт.
  1. После установки AutoIt 3 нужно открыть диск и создайте новую пустую папку
  2. Правой кнопкой мыши щёлкнуть на свободном месте и выберете "Создать" -> "AutoIt v3 Script"
  3. Создастся файл скрипта. Открыть его можно обычным щелчком мыши.

Приступим к реализации.

Сначала я опишу функцию которая будет записывать переданный текст в блокнот.

Ключевое слово отмечающее что это будет отдельная функция, а не последовательность команд это Func - начало функции и EndFunc конец функции.
Любая переменная начинается с ключевого символа $. Объявляется в любом месте.
Func AddTextToNotePad($TextValut)
  if WinActivate("Безымянный - Блокнот") == 0 then; попробуем перейти в уже открытый  блокнот
    ;~ если не удалось найти блокнот то запустим новый
    Run("notepad.exe"); запустить блокнот
  EndIf
  ;~ ждём пока не откроется блокнот
  WinWaitActive("Безымянный - Блокнот") ; 
  Send($TextValut); передаём текст в блокнот
  Send("{ENTER}"); Переходим на новую строку 
Sleep(10000) ; останавливаем скрипт, что бы сделать что то с сообщением.
EndFunc
Давайте разбирать что же я здесь написал.
функция WinActivate пытается активировать указанное окно, в случае его отсутствия или невозможности активировать результат исполнения будет 0 иначе 1
Функция WinWaitActive Блокирует исполнение скрипта пока указанное окно не будет активно
Функция Run запускает указанное приложение
Функция Send посылает активному окну сообщение или нажатие клавиши
Функция Sleep останавливает исполнение скрипта на указанный период времени

В комплект с AutoIt Идёт программа "AutoIt Window Info" которая показывает информацию об окне его название, положение, класс ... всю необходимую информацию для идентификации и работы с окном.

Теперь необходимо реализовать выполнение написанной функции
while true; ставим цикл на бесконечность
  WinWaitActive("[CLASS:#32770]"); ждём пока не появится окно MessageBox
  AddTextToNotePad(WinGetText("[CLASS:#32770]"));вызываем нашу функцию и передаём в неё информацию из окна
WEnd
Здесь для того, что бы скрипт работал всё время, а не закрылся после первого исполнения, функции помещаются в бесконечный цикл.
Далее используем уже известную функцию WinWaitActive дабы дождаться появления Диалогового окна.

Функция WinGetText вернёт видимый текст из указанного окна.

Все диалоговые окна я определяю по классу #32770 опознан класс был с помощью AutoIt Window Info

Вот простой пример скрипта.

Теперь запускаем его на исполнение клавиша F5 и смотрим что получилось.

Закрыть скрипт можно нажав по нему правой кнопкой мыши в трэе рядом с часами и выбрав команду close.

P.S. думаю буду продолжать описывать моё изучение данного инструмента

13 комментариев:

  1. По моему, это большушуй костыль к архитеруке windows, которая толком не позволяте программам взоимодействовать между собой!

    ОтветитьУдалить
  2. Ну, всё же больше для ускорения работы пользователя.

    ОтветитьУдалить
  3. а в чем выражается ускорение? :)

    ОтветитьУдалить
  4. Николай - Смотри следующий пост. Пользователю не требуется выполнять повторяющиеся действия.

    ОтветитьУдалить
  5. Ваш пример работать не буде!
    Нужно маны читать!

    ОтветитьУдалить
  6. to Garret
    Почему не будет? У меня работало. Можете аргументировать?

    ОтветитьУдалить
  7. Вы не указываете необходимую опцию, активация которой сделает ваш код работоспособным - WinTitleMatchMode = 4
    Иначе WinWaitActive будет реагировать только на заголовок окна.

    ОтветитьУдалить
  8. ну да, так и рассчитывалось, реагировать на заголовок окна. Мы же ищем открытый новый блокнот (ещё не сохранённый), если нашли то пишем в него. Если нет заводим новый, который по умолчанию имеет указанное название. И уже потом работаем, с блокнотом. WinTitleMatchMode по умолчанию = 1, что нас вполне устраивает. Мы же выполняем полное совпадение.

    ОтветитьУдалить
  9. Если у вас всё это работает то меня это сильно удивляет, так как WinWaitActive("[CLASS:#32770]") не должен срабатывать, опять же по причине WinTitleMatchMode = 1!
    Иначе зачем тогда эта опция! :)

    ОтветитьУдалить
  10. to Garrett
    Начал было уже сомневаться в работоспособности скрипта.
    Но, скопировал текст, запустил скрипт и всё работает.
    Правда нашёл ошибку в 9 строке. Потерял вызов функции остался только ("{ENTER}").

    Исправления привели к корректной работе.

    Может расскажите какую ошибку выдаёт у вас?

    ОтветитьУдалить
  11. Не поленился проверить, странно, но скрипт среагировал на CLASS#32770 O_o.
    Было время, писал скрипт, и тоже нужно было найти активное окно по CLASS, тогда, у меня не сработало при WinTitleMatchMode = 1. После этого стал сразу определять WinTitleMatchMode = 4. А сейчас на новой версии, хм-м-м-м сработало!
    Однако, всё же, по CLASS не всегда удобно обращаться! Так как любое диалоговое окно имеет #32770, это и Save File и т.д

    ОтветитьУдалить
  12. Это да, не удобно. Но пример, носит академический интерес, нежели практическое применение.
    Боле старые версии не пробовал.

    ОтветитьУдалить
  13. подскажи пожалуйста как скопировать в word вид любого диалогового окна, вылетело из головы(((((((((

    ОтветитьУдалить