Что нового

[Автоматизация] Цикличная работа 2х приложений

matrixid

Новичок
Сообщения
2
Репутация
0
Версия AutoIt: 3.3.4.0

Описание: Требуется скрипт со следующими функциями:

1. Что бы в открытом окне выбирал несколько строчек и вставал в очередь в ожидание, после того как подходит очередь – выскакивает табличка в которой требуется принять приглашение, и таких приглашений надо принять 4, все остальные отклонить. После принятия приглашения откроется отдельное окно с уникальным заголовком (4 приглашения=4 окна)
2. К каждому окну требуется запускать отдельное приложение и нажимать пару кнопок в нем (последовательно). Каждое из 4х окон периодически становится активным.
3. По истечению определенного времени в окнах станет активная кнопка, окно в котором она появилась необходимо закрыть и перейти к пункту 1.
И так далее по кругу, рано или поздно окна поменяются несколько раз (некоторые больше некоторые меньше)
--------------------------
Это мой первый опыт работы с AutoIt – перечитал мануалы, по разбирался с простенькими функциями на этом пока все.

Начал писать скрипт по теме сразу возникли следующие проблемы:
1. Какой командой после постановки в очередь в главном окне заставить его ждать выскакивание 4х приглашений?
2. Как работать с окном, если я заранее не знаю какой у него будет заголовок?
3. Как каждому из открытых 4х окон прикрепить отдельное приложение. Постараюсь пояснить – выскакивает приглашение, открывается окно после этого надо запустить отдельное приложение именно для этого окна, но если в этот момент станет активным одно из уже открытых окон, то оно собьет всю последовательность, прописанную в скрипте. Как сделать, что даже если станет активным другое приложение, что бы последовательность не сбилась и он вернулся к нужному невыполненному шагу.

Примечания: Буду очень признателен, если кто-то поможет разобраться, так же возможно оплата написания данного скрипта.
 

Guezt

Продвинутый
Сообщения
335
Репутация
82
Утилитой AutoIt Window Info можно получить заголовок окон приглашений и отлавливать их например вот так, даже если они зарание не известны в каком порядке активируются:

Код:
HotKeySet("{ESC}", "_Quit") ; Выход по ESC

Func _Quit() ; Функция выхода
   Exit
EndFunc   ;==>_Quit


While 1
   Sleep(1000 * 5) ; 5 секунд
   WinWaitActive("") ; Ждем окно
   $hWin = WinGetTitle("") ; читаем заголовок
   Switch $hWin
      Case "Калькулятор Плюс"
         $msg = "Калькулятор" ; ну тут в зависимости от выполнять любой код :) 
                   ; Run("notepad.exe") ; например запустить блокнот ; надо раскоментировать перед Run
                    _RUN() ; или вызываем функцию пока она не выполнится не будет проверки какое окно активировалось после завершения вернется обрано в скрипт и будет проверять с интервалом в 5 секунд.
      Case "Безимянный - Блокнот"
         $msg = "Блокнот"
                         ; тут запускаем еще что-то...
      Case "Google"
         $msg = "Google"
      Case Else
         $msg = "Нет из запланированных"
   EndSwitch
        ToolTip("Активное окно: "&$msg,1,1)
WEnd

Func _RUN() ; запуск блокнота с паузой в 20 секунд
    Sleep(1000*20)
    run("notepad.exe") ; например запустить блокнот
EndFunc

:smile:
 
Автор
M

matrixid

Новичок
Сообщения
2
Репутация
0
На данный момент вот, что удалось написать - очень простенько:

Код:
Opt("WinWaitDelay",100)
Opt("WinTitleMatchMode",4)
Opt("WinDetectHiddenText",1)
Opt("MouseCoordMode",0)
WinWait("Заголовок Главного окна","")
If Not WinActive("Заголовок Главного окна","") Then WinActivate("Заголовок Главного окна","")
WinWaitActive("Заголовок Главного окна","")
Send("{ALTDOWN}{TAB}{ALTUP}")
; следующие строки добавление в очередь
Sleep(1000)
MouseClick("left",498,361)
Send("{UP}")
Sleep(1000)
MouseClick("left",867,533)
Sleep(1000)
MouseClick("left",498,361)
Sleep(1000)
Send("{UP}")
Sleep(1000)
MouseClick("left",867,533)
Sleep(1000)
MouseClick("left",498,361)
Sleep(1000)
Send("{UP}")
Sleep(1000)
MouseClick("left",867,533)
Sleep(1000)
MouseClick("left",498,361)
Sleep(1000)
Send("{UP}")
Sleep(1000)
MouseClick("left",867,533)
Sleep(1000)
MouseClick("left",498,361)
Sleep(1000)
Send("{UP}")
Sleep(1000)
MouseClick("left",867,533)
Sleep(1000)
Send("{UP}")
Sleep(1000)
MouseClick("left",498,361)
Sleep(1000)
MouseClick("left",867,533)
Sleep(1000)
Send("{UP}")
Sleep(1000)
MouseClick("left",498,361)
Sleep(1000)
MouseClick("left",867,533)
Sleep(1000)
Send("{UP}")
Sleep(1000)
MouseClick("left",498,361)
Sleep(1000)
MouseClick("left",867,533)
Sleep(1000)
Send("{UP}")
Sleep(1000)
MouseClick("left",498,361)
Sleep(1000)
MouseClick("left",867,533)
;работа с первым появившимся окном очереди
Sleep(1000)
WinWait("Ожидание очереди","")
If Not WinActive("Ожидание очереди","") Then WinActivate("Ожидание очереди","")
WinWaitActive("Ожидание очереди","")
Send("{SPACE}")
WinWait("ОК","")
If Not WinActive("ОК","") Then WinActivate("ОК","")
WinWaitActive("ОК","")
Send("{SPACE}")
Sleep(1000)
MouseClick("left",11,482) ; этим действием ставлю галочку в чек бокс, AutoIt Window Info не показывает какое имя этого чекбокса поэтому мышкой
Run('C:\111\paint.exe') ; запускаю вторую программу к первому окну эти действия обязательны до появления 2го окна
WinWait("Paint","")
If Not WinActive("Paint","") Then WinActivate("Paint","")
WinWaitActive("Paint","")
Send("{ALTDOWN}{ALTUP}{DOWN}{DOWN}{DOWN}{DOWN}{ENTER}") ; перемещение по меню
WinWait("Read Profile from File","Read Profile From Fi")
If Not WinActive("Read Profile from File","Read Profile From Fi") Then WinActivate("Read Profile from File","Read Profile From Fi")
WinWaitActive("Read Profile from File","Read Profile From Fi")
Send("{TAB}{TAB}{BACKSPACE}zz.txt{ENTER}") ; загрузка конфига для программы
WinWait("Paint","")
If Not WinActive("Paint","") Then WinActivate("Paint","")
WinWaitActive("Paint","")
Send("{ALTDOWN}{ALTUP}{RIGHT}{RIGHT}{RIGHT}{ENTER}") ; запск 2й программы из меню
;работа с вторым окном
Sleep(1000)
WinWait("Ожидание очереди","")
If Not WinActive("Ожидание очереди","") Then WinActivate("Ожидание очереди","")
WinWaitActive("Ожидание очереди","")
Send("{SPACE}")
WinWait("ОК","")
If Not WinActive("ОК","") Then WinActivate("ОК","")
WinWaitActive("ОК","")
Send("{SPACE}")
Sleep(1000)
MouseClick("left",11,482)
MouseClick("left",312,965) ; выбор мышкой в трее прогррамму №2 от первого окна
WinWait("Paint","")
If Not WinActive("Paint","") Then WinActivate("Paint","")
WinWaitActive("Paint","")
Send("{ALTDOWN}{ALTUP}{DOWN}{DOWN}{ENTER}{ALTDOWN}{ALTUP}{UP}{UP}{DOWN}{DOWN}{DOWN}{DOWN}{ENTER}") ; открытие 2й копии 2й программы дял второго окна
WinWait("Read Profile from File","")
If Not WinActive("Read Profile from File","") Then WinActivate("Read Profile from File","")
WinWaitActive("Read Profile from File","")
Send("{TAB}{TAB}zz.txt{ENTER}")
WinWait("Paint","")
If Not WinActive("Paint","") Then WinActivate("Paint","")
WinWaitActive("Paint","")
Send("{ALTDOWN}{ALTUP}{RIGHT}{RIGHT}{RIGHT}{ENTER}")
;работа с третьим окном аналогична
Sleep(1000)
WinWait("Ожидание очереди","")
If Not WinActive("Ожидание очереди","") Then WinActivate("Ожидание очереди","")
WinWaitActive("Ожидание очереди","")
Send("{SPACE}")
WinWait("ОК","")
If Not WinActive("ОК","") Then WinActivate("ОК","")
WinWaitActive("ОК","")
Send("{SPACE}")
Sleep(1000)
MouseClick("left",11,482)
MouseClick("left",312,965)
WinWait("Paint","")
If Not WinActive("Paint","") Then WinActivate("Paint","")
WinWaitActive("Paint","")
Send("{ALTDOWN}{ALTUP}{DOWN}{DOWN}{ENTER}{ALTDOWN}{ALTUP}{UP}{UP}{DOWN}{DOWN}{DOWN}{DOWN}{ENTER}")
WinWait("Read Profile from File","")
If Not WinActive("Read Profile from File","") Then WinActivate("Read Profile from File","")
WinWaitActive("Read Profile from File","")
Send("{TAB}{TAB}zz.txt{ENTER}")
WinWait("Paint","")
If Not WinActive("Paint","") Then WinActivate("Paint","")
WinWaitActive("Paint","")
Send("{ALTDOWN}{ALTUP}{RIGHT}{RIGHT}{RIGHT}{ENTER}")
;работа с четвертым окном аналогична
Sleep(1000)
WinWait("Ожидание очереди","")
If Not WinActive("Ожидание очереди","") Then WinActivate("Ожидание очереди","")
WinWaitActive("Ожидание очереди","")
Send("{SPACE}")
WinWait("ОК","")
If Not WinActive("ОК","") Then WinActivate("ОК","")
WinWaitActive("ОК","")
Send("{SPACE}")
Sleep(1000)
MouseClick("left",11,482)
MouseClick("left",312,965)
WinWait("Paint","")
If Not WinActive("Paint","") Then WinActivate("Paint","")
WinWaitActive("Paint","")
Send("{ALTDOWN}{ALTUP}{DOWN}{DOWN}{ENTER}{ALTDOWN}{ALTUP}{UP}{UP}{DOWN}{DOWN}{DOWN}{DOWN}{ENTER}")
WinWait("Read Profile from File","")
If Not WinActive("Read Profile from File","") Then WinActivate("Read Profile from File","")
WinWaitActive("Read Profile from File","")
Send("{TAB}{TAB}zz.txt{ENTER}")
WinWait("Paint","")
If Not WinActive("Paint","") Then WinActivate("Paint","")
WinWaitActive("Paint","")
Send("{ALTDOWN}{ALTUP}{RIGHT}{RIGHT}{RIGHT}{ENTER}")
; после открытия 4 окон закрыть прочие ожидающие окна при появлении
WinWait("Ожидание очереди","")
If Not WinActive("Ожидание очереди","") Then WinActivate("Ожидание очереди","")
WinWaitActive("Ожидание очереди","")
Send("{RIGHT}{SPACE}")
WinWait("Ожидание очереди","")
If Not WinActive("Ожидание очереди","") Then WinActivate("Ожидание очереди","")
WinWaitActive("Ожидание очереди","")
Send("{RIGHT}{SPACE}")
WinWait("Ожидание очереди","")
If Not WinActive("Ожидание очереди","") Then WinActivate("Ожидание очереди","")
WinWaitActive("Ожидание очереди","")
Send("{RIGHT}{SPACE}")


Все 4 окна и 4 дополнительные программы к ним запускаются и отрабатывают нормально, но есть следующие проблемы:

1. 1,2,3 окна открываются как бы без проблем, но когда доходит очередь до 4го - к этому времени первые 3 упорно работают и постяонно с разным интервалом времени стают активными, что мешает правильнмоу запуску 4го окна и дополнитеьной проги к ниму. Скрипт прирывается.
Как прописать, что бы он возвращался к нужнмоу окну и продолжил выполнять на чем остановился?

2. Как задать, что бы он проверял открыто ли сейчас все 4 окна, если нет то вставать снова в очередь в главном окне

3. Спустя какой то промежуток времени в окне появится кнопка, после ее появления окно следует закрыть и стать снова в очередь в главном окне
AutoIt Window Info на копку ни какий информации не отображает. Как это реализовать? На ум приходит только считывать пиксели по координатам и сраунивать с пикселями когда кнопки еще нету. Или есть другие решения?

P.S: Код написан не рационально, не пинайте я только учусь )

Guezt спасибо за совет, но пока сложноват для меня твой код, надеюсь поможете разобраться!
 

Guezt

Продвинутый
Сообщения
335
Репутация
82
OffTopic:
Скрипт, напомнил мне мой первый инталятор на AutoIT ;D

matrixid [url_ex=javascript:qq.OpenLink('[url=http://autoit-script.ru/index.php?topic=1185.msg8799#msg8799%27]Re: [Автоматизация] Цикличная работа 2х приложений)][?][/url_ex]
1. 1,2,3 окна открываются как бы без проблем, но когда доходит очередь до 4го - к этому времени первые 3 упорно работают и постяонно с разным интервалом времени стают активными, что мешает правильнмоу запуску 4го окна и дополнитеьной проги к ниму. Скрипт прирывается.

Вместо ожидания 4й программы проверь окрыто ее окно или нет если открыто то активируй "на передний план"
Код:
; проверяем так 4 программу 
if WinExists("4 программа") Then  ; если есть окно то
         WinActivate("4 программа") ; активируем это окно
 Else ; если нет
       WinWaitActive("4 программа") ; то ждем пока появится
EndIf
;-----------------------------------------------------------------------

if Not WinExists ("1 программа") And Not WinExists ("2 программа") And Not WinExists ("3 программа") And Not WinExists ("4 программа") Then
   MsgBox(0,'','Все программы завершены')
EndIf


гляну код позже, не могу понять что в нём, называется "код в лоб" :smile:
 
Верх