Что нового

Окно перехватывает управление у скрипта AutoIT

Boris

Дорогу осилит идущий
Сообщения
25
Репутация
0
Доброе время суток уважаемые форумчане,

В программе на JavaScript в IE11 Windows7 во внутренней сети организации нажимается пункт меню "Выход". Появляется запрос - см.прикрепленный файл
После этого скрипт пытается нажать на ОК:
Код:
$n=WinActivate('Сообщение')
ControlClick($n,'','[CLASS:Button;INSTANCE:1]')

и ничего не происходит. Пробовал вместо ControlClick высылать ENTER и другие команды - окно с сообщением игнорирует все команды AutoIT. Получается что окно перехватывает управление у скрипта. Скрипт ждет закрытия окна. Если нажать ОК вручную - скрипт продолжает работу.
Если после появления окна запустить еще один скрипт
Код:
$n=WinActivate('Сообщение')
ControlClick($n,'','[CLASS:Button;INSTANCE:1]')

окно реагирует и ОК нажимается, но если сначала нажать пункт меню "Выход" то с появлением окна "Сообщение" скрипт теряет управление. Что это может быть? Прошу помочь очень нужно. Заранее благодарю за любые сообщения.
 

Вложения

  • 1.jpg
    1.jpg
    7.7 КБ · Просмотры: 7

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Boris сказал(а):
Пробовал вместо ControlClick высылать ENTER и другие команды - окно с сообщением игнорирует все команды AutoIT.

Сперва попробуйте проверить возвращает ли WinActivate дескриптор окна

Код:
$hWnd = WinActivate("Сообщение c веб-страницы")
If Not $hWnd Then Exit MsgBox(4096, "Сообщение", "Окно не найдено, завершаем работу скрипта")


Если нет попробуйте ожидать сообщение в нужном вам месте

Код:
WinWait()
WinWaitActive()
 
Автор
B

Boris

Дорогу осилит идущий
Сообщения
25
Репутация
0
Сперва попробуйте проверить возвращает ли WinActivate дескриптор окна
Код:
$hWnd = WinActivate("Сообщение c веб-страницы")
If Not $hWnd Then Exit MsgBox(4096, "Сообщение", "Окно не найдено, завершаем работу скрипта")

Если нет попробуйте ожидать окно в нужном вам месте
Код:
WinWait()
WinWaitActive()

[/quote]

Наверное не совсем меня поняли:
Нажимается в верхнем меню "Выход" и появляется запрос в виде Windусового запроса "Выйти из приложения?". Так вот проблема в том что СКРИПТ AutoIt не работает дальше - что WinWait что WinWaitActive что ControlClick без разницы они - НЕ РАБОТАЮТ потому что скрипт до них не доходит - он ждет завершения окна с запросом "Выйти из приложения". Понимаете? Нечего просто ждать после появления окна "Выйти из приложения?" - скрипт останавливает свою работу и ждет закрытия этого окна.

Предполагаю что проблема в перехвате управления JavaScript и что решение где то в районе передачи управления, фокуса и т.д. Прошу если знаете ответ - подскажите буду благодарен.
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Boris сказал(а):
Пробовал вместо ControlClick высылать ENTER и другие команды - окно с сообщением игнорирует все команды AutoIT.

потому что скрипт до них не доходит - он ждет завершения окна с запросом "Выйти из приложения"

Кому вы их высылали если даже не знаете вернул ли WinActive дескриптор окна сообщения? Может поэтому окно сообщения не закрывается и скрипт ждет пока оно закроется?

Нужен весь код
 
Автор
B

Boris

Дорогу осилит идущий
Сообщения
25
Репутация
0
Tempo сказал(а):
Boris сказал(а):
Пробовал вместо ControlClick высылать ENTER и другие команды - окно с сообщением игнорирует все команды AutoIT.

потому что скрипт до них не доходит - он ждет завершения окна с запросом "Выйти из приложения"

Кому вы их высылали если даже не знаете вернул ли WinActive дескриптор окна сообщения? Может поэтому окно сообщения не закрывается и скрипт ждет пока оно закроется?

Нужен весь код
Вы меня в тупик ставите своими вопросами. Давайте так для эксперимента я упростил код донельзя убрал ВСЕ команды кроме двух.
Запускаю JS программу с кнопкой Выход и включаю этот код:
1. Клик на кнопку Выход - появилось окно запроса.
2. MsgBox(0,'','Проверка').
Код:
$oIE=_IEAttach('title окна')
$oObj=_IEGetObjById($oIE,'id кнопки Выход')
_IEAction($oObj,"focus")
_IEAction($oObj,"click")
;здесь появляется окно запроса
MsgBox(0,'','Проверка')


Как вы понимаете MsgBox в любом случае должен выйти на экран есть окно, нет окна - но этого не происходит. Также с любыми другими командами.
Если вручную закрыть окно - MsgBox сразу же появляется.
Скрипт просто не может пройти мимо окна, что то мешает ему, перехватывает управление. Скорее всего это связано с JS. Других причин я не вижу. Надеюсь я понятно изложил - если что извините не писатель


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

Garrett сказал(а):
Спасибо большущее. Оказывается это распространенная проблема. Кажется что то нащупал здесь http://autoit-script.ru/index.php?topic=7339.0 Попробую сваять свой код - отпишусь о результатах


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

Доброго Вам времени суток уважаемые коллеги,

Решил я проблемку с подачи Garret - ему отдельное спасибо :smile:. Как я и предполагал окно запроса блокирует работу скрипта. Обойти эту блокировку скрипт сам не может - окно не дает. Решение я нашел здесь http://autoit-script.ru/index.php?topic=7339.0. Если убрать шелуху - суть проста перед появлением окна запустить другой скрипт который и закроет окно.
Вот для примера простейшая реализация такого скрипта, назовем его WinKiller.au3:
Код:
$hD=WinWait('Сообщение')
WinActivate($hD)
ControlClick($hD,'','[CLASS:Button;INSTANCE:1]')

В основном скрипе до нажатия кнопки Выход (например) запускаем на выполнение WinKiller.
Код:
Run(@AutoItExe&' Путь к WinKiller.au3')
$oIE=_IEAttach('title окна')
$oObj=_IEGetObjById($oIE,'ID кнопка Выход')
_IEAction($oObj,"focus")
_IEAction($oObj,"click")
;здесь появляется окно запроса, WinKiller срабатывает и окно закрывается, что и требовалось
; дальнейший код скрипта

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