Автор Тема: Помогите сделать скрипт (запуск программы, блокировка ввода, закрытие программы)  (Прочитано 1845 раз)

0 Пользователей и 1 Гость просматривают эту тему.

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

Оффлайн CoolAller [?]

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

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

После этого нужно как-то отследить появление надписи в самом окне и дать команду на закрытие программы. Вот в принципе все.
« Последнее редактирование: Март 25, 2017, 13:04:22 от CoolAller »

Русское сообщество AutoIt


Оффлайн hedji [?]

  • Продвинутый
  • ***
  • Сообщений: 329
  • Репутация: 60
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Код лучше заключать в тэги AutoIT.
По вопросу:
Код: 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()
 


Оффлайн CoolAller [?]

  • Новичок
  • *
  • Сообщений: 24

  • Автор темы
  • Репутация: 0
    • Награды
  • Версия AutoIt: 3.3.14.0
hedji, большое спасибо за ответ, но почему-то не включает блокировку.

Оффлайн hedji [?]

  • Продвинутый
  • ***
  • Сообщений: 329
  • Репутация: 60
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
hedji, большое спасибо за ответ, но почему-то не включает блокировку.
не включает блокировку и не отправляет клавиши?
или не блокирует, но ALT, D, A отправляет?

Русское сообщество AutoIt


Оффлайн CoolAller [?]

  • Новичок
  • *
  • Сообщений: 24

  • Автор темы
  • Репутация: 0
    • Награды
  • Версия AutoIt: 3.3.14.0
hedji, не блокирует, но ALT, D, A отправляет.

Оффлайн hedji [?]

  • Продвинутый
  • ***
  • Сообщений: 329
  • Репутация: 60
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Код: AutoIt [Выделить]
 BlockInput(1) ;блочим клаву только, если окно есть
    Send("{ALT}") ; последовательно передаем нажатия кнопок
    Send("{D}")
    Send("{A}")
    BlockInput(0) ;разблокируем клаву
 


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



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

Оффлайн CoolAller [?]

  • Новичок
  • *
  • Сообщений: 24

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

Оффлайн hedji [?]

  • Продвинутый
  • ***
  • Сообщений: 329
  • Репутация: 60
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
hedji, да действительно так она блокируется, но так как блок происходит уже после появления окна, то это не приводит к нужному эффекту, так как в любом случае пользователь может нажать мышью на другое окно и выполнение скрипта остановится.

Код: AutoIt [Выделить]
#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
 


Русское сообщество AutoIt


Оффлайн CoolAller [?]

  • Новичок
  • *
  • Сообщений: 24

  • Автор темы
  • Репутация: 0
    • Награды
  • Версия AutoIt: 3.3.14.0
hedji, в общем оказалось сложнее чем я думал, нужно как-то сделать так:

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

Код: AutoIt [Выделить]
$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

« Последнее редактирование: Март 13, 2017, 19:24:43 от CoolAller »

Оффлайн hedji [?]

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

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

Оффлайн CoolAller [?]

  • Новичок
  • *
  • Сообщений: 24

  • Автор темы
  • Репутация: 0
    • Награды
  • Версия AutoIt: 3.3.14.0
hedji, Нужно как-то при выводе окна мониторить появление надписей: Success Read ParameterFile и Success read Load file (я не знаю как записать оба эти условия, возможно нужно делать через StringRegExp), потом если эти надписи в окне находятся запускать блокировку кнопок, (если не находятся, то просто завершать скрипт), потом посылать нажатия кнопок: Send("{ALT}")  Send("{D}")  Send("{A}"), и после появления в окне надписи AutoProcedure(Epv) PASS закрывать программу и снимать блокировку кнопок.
« Последнее редактирование: Март 25, 2017, 13:05:51 от CoolAller »

Оффлайн hedji [?]

  • Продвинутый
  • ***
  • Сообщений: 329
  • Репутация: 60
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Если навести AutoIt Window Info на второе окно, он видит текст Success Read ParameterFile ?

Оффлайн CoolAller [?]

  • Новичок
  • *
  • Сообщений: 24

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

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

« Последнее редактирование: Март 25, 2017, 13:06:31 от CoolAller »

Оффлайн hedji [?]

  • Продвинутый
  • ***
  • Сообщений: 329
  • Репутация: 60
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
А зачем мониторить оба условия, если Success read Load file идет всегда вторым и достаточным?

Оффлайн CoolAller [?]

  • Новичок
  • *
  • Сообщений: 24

  • Автор темы
  • Репутация: 0
    • Награды
  • Версия AutoIt: 3.3.14.0
Проблема в том, что Success read Load file не всегда идет вторым.

Русское сообщество AutoIt


 

Похожие темы

  Тема / Автор Ответов Последний ответ
0 Ответов
2380 Просмотров
Последний ответ Апрель 14, 2010, 14:50:22
от closers
7 Ответов
4146 Просмотров
Последний ответ Ноябрь 23, 2012, 11:59:27
от f_ckerfox
1 Ответов
1374 Просмотров
Последний ответ Сентябрь 23, 2013, 23:23:56
от sngr
1 Ответов
1824 Просмотров
Последний ответ Апрель 13, 2014, 16:35:59
от madmasles
2 Ответов
1974 Просмотров
Последний ответ Апрель 27, 2014, 01:22:52
от alex33
9 Ответов
5417 Просмотров
Последний ответ Июнь 02, 2014, 01:11:40
от amorphyc
13 Ответов
3241 Просмотров
Последний ответ Июнь 26, 2018, 19:22:50
от Wu-Tang
0 Ответов
451 Просмотров
Последний ответ Июнь 14, 2017, 10:12:20
от Aleksander-2000
1 Ответов
380 Просмотров
Последний ответ Январь 09, 2018, 01:05:54
от Vovsla
2 Ответов
113 Просмотров
Последний ответ Октябрь 11, 2018, 14:44:41
от Werwolfik