1 (изменено: ArtPetr, 2012-06-04 14:24:58)

Тема: AHK: Запуск следующей программы после завершения загрузки предыдущей

Здравствуйте.
Требуется запустить подряд несколько программ.
Помогите написать скрипт в Autohotkey, чтоб каждая следующая программа запускалась только после завершения загрузки предыдущей.
Это нужно, чтобы окна каждой из программ располагались на панели в определенном порядке.

2 (изменено: Irbis, 2012-06-04 17:19:09)

Re: AHK: Запуск следующей программы после завершения загрузки предыдущей

SetTitleMatchMode, 2
array :={"c:\Program Files\Total Commander\Totalcmd.exe": "Total Commander"
       , "notepad.exe": "ahk_class Notepad"
       , "c:\Program Files (x86)\Opera\opera.exe": "ahk_class OperaWindowClass"}

For key, value in array
{
   Run, %key%
   WinWait, %value%,,20 ; ждать появления главного окна программы
   if Errorlevel
   {
      MsgBox Time out!
	  Break
   }
}

В паре ключ : значение ключ (key) - это название запускаемого файла, может быть как исполняемый файл, так и любой, который имеет ассоциацию в системе (*.jpg, *.avi и т.д.)
Значение (value)- атрибут окна, по которому скрипт проверяет загрузку программы. В примере для блокнота и оперы это класс окна, для ТКоммандера - часть заголовка.

3

Re: AHK: Запуск следующей программы после завершения загрузки предыдущей

Irbis спасибо за опративный отклик.
Но поскольку я пользуюсь AutoHotKey недавно, не могли бы вы мне подсобить в разъяснении.
Я сейчас запускаю файлы с помощью оператора Run и прописываю далее путь к файлу и пароли (логин и пароли рекордером записал и немного подкорректировал).
Как мне вставить ваш код?

4

Re: AHK: Запуск следующей программы после завершения загрузки предыдущей

Можно просто

Run, programma.exe
WinWait, programma
Run, programma_1.exe
WinWait, programma_1

5

Re: AHK: Запуск следующей программы после завершения загрузки предыдущей

WinWait уже пробовал - к сожалению не работает.

6

Re: AHK: Запуск следующей программы после завершения загрузки предыдущей

Значит неправильно вписываешь названия главного окна программы.

7

Re: AHK: Запуск следующей программы после завершения загрузки предыдущей

Если нужны доп.действия после запуска некоторых программ, то чуть сложнее, но ничего невозможного  нет


SetTitleMatchMode, 2
array :={"c:\Program Files\Total Commander\Totalcmd.exe": "Total Commander|label1"
       , "notepad.exe": "ahk_class Notepad|label2"
       , "c:\Program Files (x86)\Opera\opera.exe": "ahk_class OperaWindowClass"}

For key, value in array
{
   Run, %key%
   p2 =
   StringSplit, p, value, |
   WinWait, %p1%
   if p2
      Gosub %p2%
}
return

label1:
MsgBox % p1
return

label2:
MsgBox % p1
return

Пояснение: В массив array вписываете пути к запускаемым файлам (C:\Program... и т.д.), после двоеточия в кавычках идет заголовок или класс окна запускаемой программы (ahk_class).
И то, и другое можно взять из U3_Spy.exe, и тогда, как написал Malcev, все получится.
В тех же кавычках после | идет название подпрограммы, которая запустится после появления нужного окна.
В моем примере "Total Commander|label1" означает, что после появления окна тотал коммандера управление перейдет на процедуру с меткой label1,
где появится окно с сообщением. Тебе нужно вместо MessageBox % p1 вставить код, который задуман тобой при появлении нужного окна - в твоем случае, это записанная рекордером последовательность.
Для тех окон, где вводить и делать ничего не надо, |label нужно убрать.
То есть вместо "ahk_class Notepad|label2" будет просто "ahk_class Notepad"
Надеюсь, я объяснил достаточно популярно.

8 (изменено: ArtPetr, 2012-06-05 15:48:07)

Re: AHK: Запуск следующей программы после завершения загрузки предыдущей

Run C:\Program Files\thinkorswim\thinkorswim.exe
WinWait, Logon to thinkorswim, 
IfWinNotActive, Logon to thinkorswim, , WinActivate, Logon to thinkorswim, 
WinWaitActive, Logon to thinkorswim, 
MouseClick, left,  207,  309
Sleep, 100
MouseClick, left,  179,  370
Sleep, 100
Send, xxx{TAB}xxxxx{ENTER}

SetTitleMatchMode, 2
array :={"C:\Program Files\thinkorswim\thinkorswim.exe": "ahk_class com.devexperts.tos.ui.user.util.DetachedFrame|label1"
       , "D:\Программы\RoxInstallNewVAD\ROX.exe": "ahk_class LEWBAR32|label2"
       , "C:\Program Files\UT Software\ArchePro\ArcheClient": "ahk_class WindowsForms10.Window.8.app.0.171b980_r18_ad1|label3"}
        
For key, value in array
{
   Run, %key%
   p2 =
   StringSplit, p, value, |
   WinWait, %p1%
   if p2
      Gosub %p2%
}
return
 
label1:
Run D:\Программы\RoxInstallNewVAD\ROX.exe
WinWait, Rox Sign On, 
IfWinNotActive, Rox Sign On, , WinActivate, Rox Sign On, 
WinWaitActive, Rox Sign On, 
MouseClick, left,  100,  59
Sleep, 100
Send, xxxxR{TAB}xxx{ENTER}
return

label2:
Run C:\Program Files\UT Software\ArchePro\ArcheClient
WinWait, Login, 
IfWinNotActive, Login, , WinActivate, Login, 
WinWaitActive, Login, 
MouseClick, left,  97,  75
Sleep, 100
Send, xxx{ENTER}
return

label3:
Run C:\Program Files\thinkorswim\thinkorswim.exe
WinWaitActive, Logon to thinkorswim, 
MouseClick, left,  319,  306
Sleep, 100
MouseClick, left,  262,  370
Sleep, 100
Send, xxx{TAB}xxx{ENTER}
return

Irbis, посмотрите, пожалуйста, правильность моего кода - у меня первым идет запуск программы и вбитие пароля и логина, потом опреции по определению появления окон и запуск второй программы label1: и т.д.

а что делать в блоке где %key% и p1 b p2?

9 (изменено: Irbis, 2012-06-05 23:16:48)

Re: AHK: Запуск следующей программы после завершения загрузки предыдущей

ArtPetr пишет:

... запуск второй программы label1: и т.д. ...

1ая, также как и 2ая и другие программы запускаются в цикле for {...}, а по метке label1 и другим лишь происходят дополнительные действия - посыл текстовых строк, нажатие клавиш мыши и прочее, то есть Run там не нужен.

ArtPetr пишет:

а что делать в блоке где %key% и p1 b p2?

В этом блоке ничего делать не нужно, там обрабатывается список программ, заданный в array.

Не совсем понятен порядок действий, лучше словесно напишите, что за чем следует.
Например, первой строкой идет Run C:\Program Files\thinkorswim\thinkorswim.exe, затем в массиве array она повторяется, то есть нужно, чтоб программа запускалась дважды?
Далее, после ее запуска идет переход на label1, где запускается D:\Программы\RoxInstallNewVAD\ROX.exe, затем она запускается еще раз, потому что она прописана в  array...
Наверно, это не совсем то, что нужно. Уточните.

10

Re: AHK: Запуск следующей программы после завершения загрузки предыдущей

В общем мне надо сделать аналог следующего кода, только чтоб запуск происходил не по задержке времени, а после загрузки окон каждой из программ.
Программа thinkorswim.exe запускается действительно дважды - различие только в изменении определенного режима, который в нажатии мышки прописывается.

Run C:\Program Files\thinkorswim\thinkorswim.exe
WinWait, Logon to thinkorswim, 
IfWinNotActive, Logon to thinkorswim, , WinActivate, Logon to thinkorswim, 
WinWaitActive, Logon to thinkorswim, 
MouseClick, left,  207,  309
Sleep, 100
MouseClick, left,  179,  370
Sleep, 100
Send, xxxxx{TAB}xxxxx{ENTER}
Sleep, 60000
Run D:\Программы\RoxInstallNewVAD\ROX.exe
WinWait, Rox Sign On, 
IfWinNotActive, Rox Sign On, , WinActivate, Rox Sign On, 
WinWaitActive, Rox Sign On, 
MouseClick, left,  100,  59
Sleep, 100
Send, xxxxx{TAB}xxxxo{ENTER}
Sleep, 30000
Run C:\Program Files\UT Software\ArchePro\ArcheClient
WinWait, Login, 
IfWinNotActive, Login, , WinActivate, Login, 
WinWaitActive, Login, 
MouseClick, left,  97,  75
Sleep, 100
Send, demoxxxx{ENTER}
Sleep, 15000
Run C:\Program Files\thinkorswim\thinkorswim.exe
WinWait, Logon to thinkorswim, 
IfWinNotActive, Logon to thinkorswim, , WinActivate, Logon to thinkorswim, 
WinWaitActive, Logon to thinkorswim, 
MouseClick, left,  319,  306
Sleep, 100
MouseClick, left,  262,  370
Sleep, 100
Send, xxx{TAB}xxxxx{ENTER}

11 (изменено: Irbis, 2012-06-06 02:18:35)

Re: AHK: Запуск следующей программы после завершения загрузки предыдущей

Раз пример рабочий, проще его и доделать. Вместо sleep, 60000 и т.д. подставить winwait, <Заголовок или класс нужного окна>. (Запятые после этого параметра не нужны)

Конструкция IfWinNotActive, Rox Sign On, , WinActivate, Rox Sign On, выглядит, мягко говоря, подозрительно, потому что  полная ее форма
                    IfWinNotActive [, WinTitle, WinText, ExcludeTitle, ExcludeText] как бы намекает, что после запятых идут параметры, а не команды. (Для них надо начинать с новой строки)

12

Re: AHK: Запуск следующей программы после завершения загрузки предыдущей

Irbis пишет:

Конструкция IfWinNotActive, Rox Sign On, , WinActivate, Rox Sign On, выглядит, мягко говоря, подозрительно, потому что  полная ее форма
                    IfWinNotActive [, WinTitle, WinText, ExcludeTitle, ExcludeText] как бы намекает, что после запятых идут параметры, а не команды. (Для них надо начинать с новой строки)

На самом деле здесь всё правильно:

ExcludeTitle: Due to backward compatibility with .aut scripts, this parameter will be interpreted as a command if it exactly matches the name of a command.

IfWinExist, Program Manager,, MsgBox, Здесь может быть команда!
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

13

Re: AHK: Запуск следующей программы после завершения загрузки предыдущей

WinWait работает, НО в заголовке каждого окна 1-й программы есть Build_номер, который меняется после обновления, а класы каждого окна одинаковые - засада получается.
Все конструкции типа "IfWinNotActive, Rox Sign On, , WinActivate, Rox Sign On" делал в основном рекордер и работают нормально.

14 (изменено: Irbis, 2012-06-09 00:03:42)

Re: AHK: Запуск следующей программы после завершения загрузки предыдущей

teadrinker пишет:

...На самом деле здесь всё правильно...

Mea culpa, действительно, в справке ahk_L так и написанно. Недочитал.

ArtPetr, команда SetTitleMatchMode, 2 действует таким образом, что для WinWait и прочих команд не нужно строгого соответствия, можно написать в названии часть заголовка окна, которое не изменяетя, т.е. без номера версии.

15

Re: AHK: Запуск следующей программы после завершения загрузки предыдущей

всем участникам обсуждения большое спасибо.
все вроде заработало