1

Тема: AHK: Выполнение задач в зависимости от активности окна программы

Уважаемые пользователи , помогите пожалуйста разобраться с AHK скриптом который будет обращать внимание на текущее состояние приложения , т.е активно ли оно , если да то делать это , если нет , то делать другое.
Я примерно попытался поработать с конструкциями If'a но к сожалению у меня ничего не вышло , либо я не освоил как правильно это делать, т.к в моём случаи получалось всё что мне хотелось но, с учётом того, что скрипт нужно было запускать дважды ...
Подтолкните меня каким нибудь вариантами , буду очень Вам благодарен.

2

Re: AHK: Выполнение задач в зависимости от активности окна программы

Что такое активность приложения? Если активность окна, то она проверяется функцией WinActive("Заголовок") или командой IfWinActive, Заголовок. Проверку можно зациклить командой Loop. Лучше приведите сами пример вашей попытки, чтобы было понятно, что у вас не так.

3

Re: AHK: Выполнение задач в зависимости от активности окна программы

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

find := "C:\Program Files\ICCup\Launcher\Launcher.exe"

Gui,Add,Edit,x143 y12 w150 h21 vlogin,Login
Gui,Add,Edit,x143 y46 w150 h21 vpass,Password
Gui,Add,Text,x144 y79 w80 h20,Remember?
Gui,Add,Checkbox,x224 y80 w68 h13,Checkbox
Gui,Add,Button,x143 y109 w150 h23 gKey,Okey I'm Ready
Gui,Show,w441 h152,Created with GUI Creator by maestrith
return
GuiClose:
ExitApp
return

key:
GuiControlGet, Login
GuiControlGet, Pass
Gui, minimize

;Relative:	673, 603 (default)

WinWait, iCCup Launcher, , 1 ; ищем в течение 1 секунды, существует ли окно с названием test.
if ErrorLevel ; данная запись означает, что переменная ErrorLevel имеет значение, отличное от нуля.
	Run, %find%
else
	WinActivate iCCup Launcher
	WinWait, iCCup Launcher
	MouseClick, left, 673, 603

if (ErrorLevel = 0) {
	#IfWinNotActive Warcraft III
	Sleep, 10000
	SendInput, {vk42}
	Sleep, 15000
	MouseClickDrag, left, 414, 232, 71, 229
	SendInput, {vk8}
	SendInput, %Login%
	MouseClick, left, 322, 344
	SendInput, %Pass%{enter}
	Sleep, 5000
	MouseClick, left, 123, 290
	Sleep, 3000
	SendInput, LZ{enter}
	Sleep, 3000
	SendInput, Всем привет{enter}
}

if (ErrorLevel > 0) {
	MsgBox, Somthing Wrong
	return
}

4

Re: AHK: Выполнение задач в зависимости от активности окна программы

Так что вы понимаете под "активно ли приложение"? Запущено? Активно его окно?

К чему у вас должны относиться последние две проверки ErrorLevel?

5 (изменено: Violence-Fetish, 2017-01-23 12:21:38)

Re: AHK: Выполнение задач в зависимости от активности окна программы

Постараюсь крайне близко описать то что хочу сделать :
Получается ставим изначально проверку "Запущено ли вообще приложение" как я понимаю за это отвечает #IfWinNotExist
Далее Если оно запущено то "Ждём его прогрузки" как я понимаю за это отвечает уже WinWait
После чего если оно уже запущено (#IfWinExist) и прогружено , активируем его при помощи WinActivate
Потом юзаем нужный клик по нужным координатам приложения.
По возможности добавить проверки на баги в скрипте вида : Если приложение уже запущено то не перезапускать его , если приложение не запущено то не выполнять последующие действия кроме как запустить его (тут как я понимаю понадобится задействовать loop)

Что касаемо ErrorLevel , пытался сделать проверку (но судя по Вашему вопросу , я был не прав сделав это).
Просто в документации прочитал что изначально запущенное приложение имеет состояние ErrorLevel 0 (если я и тут ничего не перепутал) , и всё что находится внутри ErrorLevel 0 будет выполняться.

6 (изменено: Violence-Fetish, 2017-01-23 12:55:43)

Re: AHK: Выполнение задач в зависимости от активности окна программы

Вот ещё одно моё решение с использованием быдло кода , вот как это превратить в более адекватное решение ?

IfWinExist, iCCup Launcher ; поиск окна
{
	WinWait, iCCup Launcher ; ожидание появления окна
	WinActivate ; активация окна
}
else ; или
{
	Run, C:\Program Files\ICCup\Launcher\Launcher.exe
	WinWait, iCCup Launcher ; ожидание появления окна
	WinActivate ; активация окна
	MouseMove, 672, 602
}

7

Re: AHK: Выполнение задач в зависимости от активности окна программы

Наверно, проще всего так:


app = C:\Program Files\ICCup\Launcher\Launcher.exe
win = iCCup Launcher

IfWinNotExist, %win%
{
    Run, %app%
    WinWait, %win%
}
WinActivate, %win%
WinWaitActive, %win%

; Действия в окне.

8 (изменено: Violence-Fetish, 2017-01-23 13:23:10)

Re: AHK: Выполнение задач в зависимости от активности окна программы

Кстати , хотел ещё поинтересоваться , а возможно ли отловить действия клиента при помощи AHK ? , к примеру смотрите :
Есть некий клиент допустим тот же самый Warcraft III , на загрузку приложения требуется некоторое время прежде чем передать AHK новые действия т.е приходится юзать Sleep, N-время.
Суть в том что у каждого компьютера из-за мощности и многих других факторов прогрузка окна длится не фиксированное кол-во времени , как с этим быть ? или тут уже ничего не поделать и просто задать AHK скрипту Sleep по больше (но тогда это будет не камельфо).

(Осенило) Если мы вылавливаем процесс как WinWait можно ли тоже самое использовать для любого другого процесса ?

з.ы Спасибо , Ваш ответ помог мне , постараюсь в дальнейшем не быдлокодить ).

9

Re: AHK: Выполнение задач в зависимости от активности окна программы

Тема перенесена по принадлежности.
Заголовок исправлен на более вменяемый.

10

Re: AHK: Выполнение задач в зависимости от активности окна программы

Violence-Fetish пишет:

Если мы вылавливаем процесс как WinWait можно ли тоже самое использовать для любого другого процесса ?

Если у него есть окно, то можно.

11

Re: AHK: Выполнение задач в зависимости от активности окна программы

Вы имеете ввиду "оконный режим" ? или я Вас не верно понял ?
Только что попробовал нечто вроде этого

IfWinExist, %win2%
{
	WinWait, %win2%, , 7
	SendInput, {vk42}
}

К сожалению моя идея не выгорела ...

12

Re: AHK: Выполнение задач в зависимости от активности окна программы

Нет, просто программа не обязана иметь окно, если оно ей не требуется.

А в вашей идее WinWait избыточно, т.к. код выполняется, если окно существует. Зачем же его ждать? А для SendInput нужно, чтобы окно не просто существовало, а было активным.