Доброго времени суток.
Помогите пожалуйста. До этого времени я всегда находил ответы на все вопросы связанные с autoit, но ту какая-то мистика. Проблема связана скорее с программой, которую я пытаюсь автоматизировать, а не с AutoIt, но надеюсь дело во мне.
Программа: PTC Creo (CAD программа, если кому-то интересно)
Суть: Первая версия моей программы исполняла то что нужно, но не в фоновом режиме, т.е. нельзя трогать мышь и клавиатуру. К сожалению я только недавно узнал, что ControlSend и подобное работает фоново не требуя активности окна, соотвественно понял, что могу довольно легко переписать все для работы в фоне, но возникли трудности.
Нужно в определенном окне данной программы в поле вставить текст (в данном случае не важно какой), а скорее важно сделать это так, чтобы работало 100%. а не через раз.
Изначально все работало вот так (то есть работа осуществлялась не в фоне, но работало стабильно, основное что нужно, это в [CLASS:TextArea; INSTANCE:5] подставить другое значение):
Теперь же переписал вот таким образом:
Все бы хорошо, но теперь это корректно работает всего 1 раз из десяти (имеется ввиду выполнение каждого действия в этом окне, часть стали пропускаться и т.д.). БОльшие паузы тоже не дают результата, как ни странно.
По сути 1ое от второго несильно отличается, но в активном окне это срабатывает четко, а в неактивном нет, дело тут думаю в том, что класс поля не Edit как в блокноте, а TextArea.Я так думаю, потому что функция ControlSetText не срабатывает никак (точнее в AutoItWindowsInfo видно, что текст вставился, но при этом в самом окне ничего не изменяется, т.е. элемент содержит теперь текст и свое значение, не изменившееся).
Ниже на скриншоте видно что я имею ввиду, скрин уже после запуска скрипта, значение "123" стоит как вкопанное.
Еще подозреваю, что в неактивном окне плохо работают такие вещи как Ctrl+C/Ctrl+V/Ctrl+A. Но опять же ControlSetText не срабатывает впринципе.
Вопросов несколько:
1. Можно ли заставить работать ControlSetText в таком случае?
2. Как заставить второй вариант, работающий с неактивным окном, работать корректно и 10 из 10?
P.S. ControlFocus не помогает, да и окно активным от него становится.
P.S.2. К сожалению написание всей этой автоматизации уже является костылем для крео, и костыль с этим окошком и нажиманием в нем кнопулек и редактированием этого поля обойти не представляется возможным.
P.S.3. Могу подробнее описать суть всей программы, если кому-то потребуется, но думаю в данном контексте это не поможет.
P.S.4. Простите за мой код, скорее всего для многих он выглядит весьма плохо, но пишу как умею.
Помогите пожалуйста. До этого времени я всегда находил ответы на все вопросы связанные с autoit, но ту какая-то мистика. Проблема связана скорее с программой, которую я пытаюсь автоматизировать, а не с AutoIt, но надеюсь дело во мне.
Программа: PTC Creo (CAD программа, если кому-то интересно)
Суть: Первая версия моей программы исполняла то что нужно, но не в фоновом режиме, т.е. нельзя трогать мышь и клавиатуру. К сожалению я только недавно узнал, что ControlSend и подобное работает фоново не требуя активности окна, соотвественно понял, что могу довольно легко переписать все для работы в фоне, но возникли трудности.
Нужно в определенном окне данной программы в поле вставить текст (в данном случае не важно какой), а скорее важно сделать это так, чтобы работало 100%. а не через раз.
Изначально все работало вот так (то есть работа осуществлялась не в фоне, но работало стабильно, основное что нужно, это в [CLASS:TextArea; INSTANCE:5] подставить другое значение):
Код:
WinActivate("Search Tool")
WinWaitActive("Search Tool", "", 10)
ControlClick ("Search Tool:1", "", "[CLASS:TextArea; INSTANCE:5]", "main", 1) ;SAME EVERYTIME
sleep(250)
ControlSend("Search Tool:1", '', "[CLASS:TextArea; INSTANCE:5]", '^v') ;SAME EVERYTIME
sleep(250)
send('{BACKSPACE}')
sleep(250)
ControlClick ("Search Tool:1", "", "[CLASS:Layout; INSTANCE:16]", "main", 1, 5, 5) ;NO BUILD QUERY
sleep(250)
ControlClick ("Search Tool:1", "", "[CLASS:List; INSTANCE:12]", "main", 1, 7, 7) ;SAME EVERYTIME
sleep(250)
ControlClick ("Search Tool:1", "", "[CLASS:Layout; INSTANCE:17]", "main", 1) ;NO BUILD QUERY
sleep(250)
ControlClick ("Search Tool:1", "", "[CLASS:Layout; INSTANCE:20]", "main", 1, 406, 5) ;NO BUILD QUERY
sleep(250)
Теперь же переписал вот таким образом:
Код:
WinWait("Search Tool:1")
$search_creo_wnd = WinGetTitle("Search Tool:1")
sleep(250)
ControlClick ($search_creo_wnd, "", "[CLASS:TextArea; INSTANCE:5]", "main", 1) ;SAME EVERYTIME
sleep(250)
ControlSend($search_creo_wnd, '', "[CLASS:TextArea; INSTANCE:5]", '^a')
sleep(500)
ControlSend($search_creo_wnd, '', "[CLASS:TextArea; INSTANCE:5]", '^v') ;SAME EVERYTIME
sleep(250)
ControlSend($search_creo_wnd, '', "[CLASS:TextArea; INSTANCE:5]", '{BACKSPACE}')
sleep(250)
ControlClick ($search_creo_wnd, "", "[CLASS:Layout; INSTANCE:16]", "main", 1, 5, 5) ;NO BUILD QUERY
sleep(250)
ControlClick ($search_creo_wnd, "", "[CLASS:List; INSTANCE:12]", "main", 1, 7, 7) ;SAME EVERYTIME
sleep(250)
ControlClick ($search_creo_wnd, "", "[CLASS:Layout; INSTANCE:17]", "main", 1) ;NO BUILD QUERY
sleep(250)
ControlClick ($search_creo_wnd, "", "[CLASS:Layout; INSTANCE:20]", "main", 1, 406, 5) ;NO BUILD QUERY
sleep(250)
Все бы хорошо, но теперь это корректно работает всего 1 раз из десяти (имеется ввиду выполнение каждого действия в этом окне, часть стали пропускаться и т.д.). БОльшие паузы тоже не дают результата, как ни странно.
По сути 1ое от второго несильно отличается, но в активном окне это срабатывает четко, а в неактивном нет, дело тут думаю в том, что класс поля не Edit как в блокноте, а TextArea.Я так думаю, потому что функция ControlSetText не срабатывает никак (точнее в AutoItWindowsInfo видно, что текст вставился, но при этом в самом окне ничего не изменяется, т.е. элемент содержит теперь текст и свое значение, не изменившееся).
Ниже на скриншоте видно что я имею ввиду, скрин уже после запуска скрипта, значение "123" стоит как вкопанное.
Еще подозреваю, что в неактивном окне плохо работают такие вещи как Ctrl+C/Ctrl+V/Ctrl+A. Но опять же ControlSetText не срабатывает впринципе.
Вопросов несколько:
1. Можно ли заставить работать ControlSetText в таком случае?
2. Как заставить второй вариант, работающий с неактивным окном, работать корректно и 10 из 10?
P.S. ControlFocus не помогает, да и окно активным от него становится.
P.S.2. К сожалению написание всей этой автоматизации уже является костылем для крео, и костыль с этим окошком и нажиманием в нем кнопулек и редактированием этого поля обойти не представляется возможным.
P.S.3. Могу подробнее описать суть всей программы, если кому-то потребуется, но думаю в данном контексте это не поможет.
P.S.4. Простите за мой код, скорее всего для многих он выглядит весьма плохо, но пишу как умею.