1

Тема: AHK: остановка выполнения скрипта после всплывающего Да/Нет диалога

Привет!
Автоматизирую программу, написанную на .Net (т.е. Controls не работает). Нажимаю в ней разные кнопки с помощью Acc метода DoDefaultAction. Все кнопки нажимаются хорошо, но после нажатия на одну из кнопок всплывает подтверждающий диалог с кнопками Да/Нет (Yes/No confirmation dialog / MessageBox), при этом выполнение скрипта приостанавливается пока самому не кликнуть на Да или Нет. Наверняка это известная ситуация, но ни на русском ни на английском нагуглить не смог ( Не понятно как обрабатывать это всплывающее окно и не понятно как посмотреть что происходит, как отлаживать. Запуская с дебаггером в VS Code никаких ошибок, скрипт просто ждет действия от пользователя и переходит к выполнению следующей строки кода, которая идёт после DoDefaultAction только после ручного закрытия всплывшего окна.

2 (изменено: __Михаил__, 2022-01-29 22:25:52)

Re: AHK: остановка выполнения скрипта после всплывающего Да/Нет диалога

Из-за чего АХК останавливается, это же не его окно MsgBox? Тогда не должен.
Что AhkSpy показывает при наведении на нужную кнопку?

Win11x64, AHK v1.1.37.01 (Unicode 64-bit), AHK v2.0.17| AHK-Wiki | Переменные и выражения | RegEx101

3

Re: AHK: остановка выполнения скрипта после всплывающего Да/Нет диалога

Да, это MsgBox приложения, не скрипта. Конкретно AhkSpy не пробовал, но какой-то аналогичной тулзой ничего необычного. AHK exe окна как у главного приложения, но свой заголовок с вопросом "Сохранить?". Если нужно именно AhkSpy ей попробую позже, что именно смотреть? Возможно ли в VS Code дебаггером узнать что происходит?

4

Re: AHK: остановка выполнения скрипта после всплывающего Да/Нет диалога

CruKriy7 пишет:

Возможно ли в VS Code дебаггером узнать что происходит?

Этот вопрос уже не ко мне. В AhkSpy можно навестись курсором на нужную кнопку в окне и посмотреть какие названия у неё, затем через АХК послать нажатие этой клавиши. Есть несколько вариантов отправки, нужно тестить какой подойдёт.

Win11x64, AHK v1.1.37.01 (Unicode 64-bit), AHK v2.0.17| AHK-Wiki | Переменные и выражения | RegEx101

5

Re: AHK: остановка выполнения скрипта после всплывающего Да/Нет диалога

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

6

Re: AHK: остановка выполнения скрипта после всплывающего Да/Нет диалога

Проверьте через WindowSpy, действительно ли окно сообщения относится к другому процессу.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7

Re: AHK: остановка выполнения скрипта после всплывающего Да/Нет диалога

Не должен АХК просто так прерывать свой поток из-за чужого окна. значит дело в коде.

Win11x64, AHK v1.1.37.01 (Unicode 64-bit), AHK v2.0.17| AHK-Wiki | Переменные и выражения | RegEx101

8

Re: AHK: остановка выполнения скрипта после всплывающего Да/Нет диалога

CruKriy7 пишет:

Нажимаю в ней разные кнопки с помощью Acc метода DoDefaultAction.

Просто не используйте этот метод при нажатии кнопки для появления зависающего ahk окна.

9

Re: AHK: остановка выполнения скрипта после всплывающего Да/Нет диалога

У всплывающего окна  и у основной программы разный handle, но одинаковые Class, Process ID и Thread ID. Код самого скрипта предельно простой, несколько последовательных действий, не никаких SetTimer, даже функций нет. Видимо придётся кликать мышью на эту кнопку, а не нажимать методом DoDefaultAction. Только всё равно хотелось бы понять почему так происходит, это какие-то издержки микрософтовского IAccessible или использующих её AHK библиотек (Acc)?

10

Re: AHK: остановка выполнения скрипта после всплывающего Да/Нет диалога

Also, while accDoDefaultAction is supposed to return immediately, some implementations block the return. For example, if clicking a link displays a dialog, some implementations will block the return until the dialog is dismissed. Such delays can prevent client applications from processing a dialog box. Servers should avoid implementations that block returns.

https://docs.microsoft.com/en-us/window … aultaction

11

Re: AHK: остановка выполнения скрипта после всплывающего Да/Нет диалога

Всем спасибо за обсуждение! Как и предлагалось выше, пришлось мышью кликнуть в кнопку, которую нажимал методом, только после этого следующая строка кода начала исполнятся. Для меня удивительно, что под капотом это разная реализация, буду знать. Спасибо за ссылку на документацию и разъяснения, я бы не догадался, даже заранее прочитав, что это именно про мою ситуацию. У меня была хотелка сделать всё программно с помощью Acc т.к. с IAccessible можно работать с окном, которое даже не в фокусе. Но, видимо, даже в небольших скриптах это сложно реализуемо. Буду пробовать альтернативные методы, типа более "современного" UIAutomation, интересно есть ли разница с целью работы с окном в фоне. Пока прочитал, что UIAutomation сложнее чем IAccessible для написания кода в AHK. Ещё раз всем спасибо!

12

Re: AHK: остановка выполнения скрипта после всплывающего Да/Нет диалога

С UIAutomation будет таже ситуация.
Используйте ControlClick, либо подзапарьтесь с паралельными поотоками.

13

Re: AHK: остановка выполнения скрипта после всплывающего Да/Нет диалога

Спасибо! На будущее себе записал изучить параллельные потоки.

14

Re: AHK: остановка выполнения скрипта после всплывающего Да/Нет диалога

Можете так получится:
http://forum.script-coding.com/viewtopic.php?id=14278

15

Re: AHK: остановка выполнения скрипта после всплывающего Да/Нет диалога

CruKriy7
А через 'ControlSend' нельзя кнопку разве нажать?

Win11x64, AHK v1.1.37.01 (Unicode 64-bit), AHK v2.0.17| AHK-Wiki | Переменные и выражения | RegEx101

16

Re: AHK: остановка выполнения скрипта после всплывающего Да/Нет диалога

ControlSend не работает вообще в этом ПО т.к. нет Control элементов, горячих клавиш тоже нет. Если посылать команду окну, а не элементу контрол, то не срабатывает. Вариант с хаком через системные вызовы взят на заметку.

17

Re: AHK: остановка выполнения скрипта после всплывающего Да/Нет диалога

Я в таких случаях не запариваюсь особо, получаю положение нужного элемента через iaccessible и посылаю ControlClick в нужное мне место.