Что нового

Помогите сделать скрипт (запуск программы, блокировка ввода, закрытие программы)

CoolAller

Новичок
Сообщения
24
Репутация
0
Собственно задача тривиальная, но никак не могу ее решить, нужно сделать чтобы после запуска скрипта ожидалось появление окна с заголовком QB-Programmer и такой же надписью внутри окна, при этом чтобы происходила блокировка нажатия мыши и клавиатуры. Для этого есть параметр #RequireAdmin и BlockInput(1), но проблема в том, что если выходит другое окно с таким же заголовком, но с рапотром об ошибке, то блокировка не снимается. Я понимаю, что должно быть условие "если" - "то", но я не знаю как это написать. Либо было бы еще лучше если бы была какая-то возможность при запуске программы отслеживать не активное окно, а просто проверять, что оно существует и после запуска передавать нажатия кнопок в это окно.
После завершения выполнения задачи отследить появление в окне определенной надписи и закрыть окно программы.

Вот начало этого скрипта:
Код:
#RequireAdmin
BlockInput(1)
Run("C:\Program Files (x86)\***.exe") ;запускаем экзешник
WinWaitActive("Programmer", "Programmer") ;ждем активное окно
Send("{ALT}") ; последовательно передаем нажатия кнопок
Send("{D}")
Send("{A}")
BlockInput(1)

После этого нужно как-то отследить появление надписи в самом окне и дать команду на закрытие программы. Вот в принципе все.
 

hedji

Продвинутый
Сообщения
409
Репутация
92
Код лучше заключать в тэги AutoIT.
По вопросу:
Код:
#RequireAdmin
Run("C:\Program Files (x86)\NEC Electronics Tools\QBP\V3.11\bin\qbp.exe") ;запускаем экзешник
$check = WinWaitActive("QB-Programmer", "QB-Programmer") ;ждем активное окно
if $check <> 0 Then
	BlockInput(1) ;блочим клаву только, если окно есть
	Send("{ALT}") ; последовательно передаем нажатия кнопок
	Send("{D}")
	Send("{A}")
	BlockInput(0) 
EndIf

;для вопроса передавать нажатия кнопок в конкретное окно
ControlSend()
 
Автор
C

CoolAller

Новичок
Сообщения
24
Репутация
0
hedji, большое спасибо за ответ, но почему-то не включает блокировку.
 

hedji

Продвинутый
Сообщения
409
Репутация
92
CoolAller сказал(а):
hedji, большое спасибо за ответ, но почему-то не включает блокировку.
не включает блокировку и не отправляет клавиши?
или не блокирует, но ALT, D, A отправляет?
 
Автор
C

CoolAller

Новичок
Сообщения
24
Репутация
0
hedji, не блокирует, но ALT, D, A отправляет.
 

hedji

Продвинутый
Сообщения
409
Репутация
92
Код:
BlockInput(1) ;блочим клаву только, если окно есть
    Send("{ALT}") ; последовательно передаем нажатия кнопок
    Send("{D}")
    Send("{A}")
    BlockInput(0) ;разблокируем клаву


т.к. пауз в коде не сделано, то клавиатура блокируется лишь на время отправки ALT, D, A, что занимает несколько миллисекунд.
Заменить на:
Код:
Send("{A}")
Sleep(30000)
BlockInput(0)


и клавиатура останется заблокирована на 30 сек после отправки А.
 
Автор
C

CoolAller

Новичок
Сообщения
24
Репутация
0
hedji, да действительно так она блокируется, но так как блок происходит уже после появления окна, то это не приводит к нужному эффекту, так как в любом случае пользователь может нажать мышью на другое окно и выполнение скрипта остановится.
 

hedji

Продвинутый
Сообщения
409
Репутация
92
CoolAller сказал(а):
hedji, да действительно так она блокируется, но так как блок происходит уже после появления окна, то это не приводит к нужному эффекту, так как в любом случае пользователь может нажать мышью на другое окно и выполнение скрипта остановится.

Код:
#RequireAdmin
Run("C:\Program Files (x86)\NEC Electronics Tools\QBP\V3.11\bin\qbp.exe") ;запускаем экзешник
$check = WinWait("QB-Programmer", "QB-Programmer") ;ждем окно и пусть пользователь в это время елозит мышкой
if $check <> 0 Then
    BlockInput(1) ;блочим клаву только, если окно есть
	WinActivate("QB-Programmer", "QB-Programmer") ;принудительно активируем окно
    Send("{ALT}") ; последовательно передаем нажатия кнопок
    Send("{D}")
    Send("{A}")
	WinWait("QB-Programmer", "текст в окне изменился") ;ждем пока текст в окне поменяется
	WinClose("QB-Programmer", "текст в окне изменился") ;закрываем окно
    BlockInput(0) ;разблокируем клавиатуру
EndIf
 
Автор
C

CoolAller

Новичок
Сообщения
24
Репутация
0
hedji, в общем оказалось сложнее чем я думал, нужно как-то сделать так:

После запуска экзешника сначала нужно заблокировать клаву и мышь, затем проверить не выводится ли окно в котором пишется сообщение: USB host connection failed, если оно выводится, то разблокировать мышь и клаву и прекратить выполнение кода. Если же окно с сообщеним USB host connection failed не выводится, то нужно продолжить исполнение вашего кода:

Код:
$check = WinWait("QB-Programmer", "QB-Programmer") ;ждем окно и пусть пользователь в это время елозит мышкой
if $check <> 0 Then
    BlockInput(1) ;блочим клаву только, если окно есть
    WinActivate("QB-Programmer", "QB-Programmer") ;принудительно активируем окно
    Send("{ALT}") ; последовательно передаем нажатия кнопок
    Send("{D}")
    Send("{A}")
    WinWait("QB-Programmer", "текст в окне изменился") ;ждем пока текст в окне поменяется
    WinClose("QB-Programmer", "текст в окне изменился") ;закрываем окно
    BlockInput(0) ;разблокируем клавиатуру
EndIf
 

hedji

Продвинутый
Сообщения
409
Репутация
92
Не считаю, что это есть хорошо:
1) После запуска экзешника сначала нужно заблокировать клаву и мышь
2) Никакое окно не появилось вообще (ну зависло что-нибудь)
3) Сидите бесконечно с заблокированной клавой, перезагружаете комп ресетом.

Более точно определите текст в окне QB-Programmer и текст, который должен появится после ALT-D-A, это позволит скрипту точно идентифицировать нужные окна и работать корректно.
 
Автор
C

CoolAller

Новичок
Сообщения
24
Репутация
0
hedji, Нужно как-то при выводе окна мониторить появление надписей: Success Read ParameterFile и Success read Load file (я не знаю как записать оба эти условия, возможно нужно делать через StringRegExp), потом если эти надписи в окне находятся запускать блокировку кнопок, (если не находятся, то просто завершать скрипт), потом посылать нажатия кнопок: Send("{ALT}") Send("{D}") Send("{A}"), и после появления в окне надписи AutoProcedure(Epv) PASS закрывать программу и снимать блокировку кнопок.
 

hedji

Продвинутый
Сообщения
409
Репутация
92
Если навести AutoIt Window Info на второе окно, он видит текст Success Read ParameterFile ?
 
Автор
C

CoolAller

Новичок
Сообщения
24
Репутация
0
hedji, Сообщение выше отредактировал, убрал лишнее. Success Read ParameterFile видится, так как отрабатывает эта часть кода:

Код:
WinWait("Programmer", "Success Read ParameterFile") ;ждем пока текст в окне поменяется
    WinClose("Programmer", "Success Read ParameterFile") ;закрываем окно
    BlockInput(0) ;разблокируем клавиатуру
 

hedji

Продвинутый
Сообщения
409
Репутация
92
А зачем мониторить оба условия, если Success read Load file идет всегда вторым и достаточным?
 
Автор
C

CoolAller

Новичок
Сообщения
24
Репутация
0
Проблема в том, что Success read Load file не всегда идет вторым.
 

hedji

Продвинутый
Сообщения
409
Репутация
92
Сначала ждем окно Success Read ParameterFile, потом Success read Load file, неважно в какой последовательности они будут в самом окне.
Код:
WinWait("QB-Programmer", "Success Read ParameterFile")
WinWait("QB-Programmer", "Success read Load file")
WinClose("QB-Programmer", "Success Read ParameterFile")



Добавлено:
Сообщение автоматически объединено:

Код:
$check = WinWait("QB-Programmer", "QB-Programmer startup..")
;или
$check = WinWait("QB-Programmer", "Command standby")

к тому тексту, что всегда появляется в окне до Reading ParameterFile
 
Автор
C

CoolAller

Новичок
Сообщения
24
Репутация
0
hedji, если скрипт будет выглядеть таким образом, то, в случае если скрипт не дождется ожидаемой надписи, он просто будет виснуть в трее поставив свое выполнение на паузу, а оттуда его потом только вручную закрывать. Т.е. как я понимаю, нужно либо задать какой-то таймаут ожидания надписи, после истечения которого если надпись не появляется завершать скрипт. Либо как-то делать через StringRegExp задавая поиск в тексте (я не знаю как это сделать).
hedji сказал(а):
к тому тексту, что всегда появляется в окне до Reading ParameterFile
Так нельзя, потому что обязательно должна происходить проверка на Success Read ParameterFile и Success read Load file, так как если эти надписи не появятся программа не будет работать и не выведет AutoProcedure(Epv) PASS, и скрипт просто будет виснуть не разблокировав мышь и клавиатуру.
 

hedji

Продвинутый
Сообщения
409
Репутация
92
Код:
#RequireAdmin
Run("C:\Program Files (x86)\NEC Electronics Tools\QBP\V3.11\bin\qbp.exe") ;запускаем экзешник
$check = WinWait("QB-Programmer", "QB-Programmer startup..", 30) ;ждем окно QB-Programmer startup.. 30 секунд, если не дождались - выходим из скрипта
if $check <> 0 Then
	BlockInput(1) ;блочим клаву только, если окно QB-Programmer startup.. есть
	$check = WinWait("QB-Programmer", "Success Read ParameterFile", 30) ;ждем окно Success Read ParameterFile 30 секунд, если не дождались - выходим из скрипта
    if $check <> 0 Then
		$check = WinWait("QB-Programmer", "Success read Load file", 30) ;ждем окно Success read Load file 30 секунд, если не дождались - выходим из скрипта
		if $check <> 0 Then			
			WinActivate("QB-Programmer", "Success read Load file") ;принудительно активируем окно
			Send("{ALT}") ; последовательно передаем нажатия кнопок
			Send("{D}")
			Send("{A}")
			WinWait("QB-Programmer", "AutoProcedure(Epv) PASS", 30) ;ждем пока текст в окне поменяется, если не меняется в течение 30 секунд - идем дальше
			WinClose("QB-Programmer", "AutoProcedure(Epv) PASS") ;закрываем окно			
		EndIf
	EndIf
	BlockInput(0) ;разблокируем клавиатуру
EndIf
 
Верх