Задача которую я сегодня реализую, будет очень простой, любое появившееся диалоговое окно, должно быть записано в блокнот.
Далее приведу пример кода, и разберу его.
Начнём с того как создать пустой скрипт.
- После установки AutoIt 3 нужно открыть диск и создайте новую пустую папку
- Правой кнопкой мыши щёлкнуть на свободном месте и выберете "Создать" -> "AutoIt v3 Script"
- Создастся файл скрипта. Открыть его можно обычным щелчком мыши.
Приступим к реализации.
Сначала я опишу функцию которая будет записывать переданный текст в блокнот.
Ключевое слово отмечающее что это будет отдельная функция, а не последовательность команд это 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. думаю буду продолжать описывать моё изучение данного инструмента
По моему, это большушуй костыль к архитеруке windows, которая толком не позволяте программам взоимодействовать между собой!
ОтветитьУдалитьНу, всё же больше для ускорения работы пользователя.
ОтветитьУдалитьа в чем выражается ускорение? :)
ОтветитьУдалитьНиколай - Смотри следующий пост. Пользователю не требуется выполнять повторяющиеся действия.
ОтветитьУдалитьВаш пример работать не буде!
ОтветитьУдалитьНужно маны читать!
to Garret
ОтветитьУдалитьПочему не будет? У меня работало. Можете аргументировать?
Вы не указываете необходимую опцию, активация которой сделает ваш код работоспособным - WinTitleMatchMode = 4
ОтветитьУдалитьИначе WinWaitActive будет реагировать только на заголовок окна.
ну да, так и рассчитывалось, реагировать на заголовок окна. Мы же ищем открытый новый блокнот (ещё не сохранённый), если нашли то пишем в него. Если нет заводим новый, который по умолчанию имеет указанное название. И уже потом работаем, с блокнотом. WinTitleMatchMode по умолчанию = 1, что нас вполне устраивает. Мы же выполняем полное совпадение.
ОтветитьУдалитьЕсли у вас всё это работает то меня это сильно удивляет, так как WinWaitActive("[CLASS:#32770]") не должен срабатывать, опять же по причине WinTitleMatchMode = 1!
ОтветитьУдалитьИначе зачем тогда эта опция! :)
to Garrett
ОтветитьУдалитьНачал было уже сомневаться в работоспособности скрипта.
Но, скопировал текст, запустил скрипт и всё работает.
Правда нашёл ошибку в 9 строке. Потерял вызов функции остался только ("{ENTER}").
Исправления привели к корректной работе.
Может расскажите какую ошибку выдаёт у вас?
Не поленился проверить, странно, но скрипт среагировал на CLASS#32770 O_o.
ОтветитьУдалитьБыло время, писал скрипт, и тоже нужно было найти активное окно по CLASS, тогда, у меня не сработало при WinTitleMatchMode = 1. После этого стал сразу определять WinTitleMatchMode = 4. А сейчас на новой версии, хм-м-м-м сработало!
Однако, всё же, по CLASS не всегда удобно обращаться! Так как любое диалоговое окно имеет #32770, это и Save File и т.д
Это да, не удобно. Но пример, носит академический интерес, нежели практическое применение.
ОтветитьУдалитьБоле старые версии не пробовал.
подскажи пожалуйста как скопировать в word вид любого диалогового окна, вылетело из головы(((((((((
ОтветитьУдалить