1 (изменено: meitx, 2025-01-26 19:47:39)

Тема: AHK: UIA как получить доступ к диалогу?

Добрый день. У меня есть простенький скрипт который перехватывает пкм при нажатом #


$#RButton::
	MouseClick, right					; отрабатываем правоклик для вызова контекстного меню
	Sleep, 10	
	Send, {DOWN 7}{ENTER}				;в контекстном меню спускаемся на 7 позиции ниже и нажимаем Enter чтобы вызвать диалоговое окно
	Send, {TAB 4}{DOWN 2}{SPACE}		;в диалоговом окне табом прыгаем до радиокнопки, нажимаем 2 до нужной кнопки и пробелом активируем
Return

Возможности забиндить кнопки в контекстном меню нет, а разработчик любит добавлять/удалять/менять местами элементы и в каждой версии приходится переделывать скрипт.
Решил переделать его "по уму":


$#RButton::
{
	MouseClick, right ; посылаю правоклик чтобы открылось контекстное меню
	UIA := UIA_Interface()
	resolve:= UIA.ElementFromHandle(WinExist("ahk_exe CLO_Standalone_OnlineAuth_x64.exe")) 
	; проверил что открыта нужная програма и получил UIA
	element:= resolve.FindFirstBy("ClassName=QAction AND Name=Split").Click() ;в контекстном меню отлавливаю элемент "Split" и кликаю его, открывается диалоговое окно

И на этом всё, EdiBox в диалоге активен и реагирует на ручное нажатие Tab, однако "Send, {TAB 4}{DOWN 2}{SPACE}"  работало в предыдущем варианте но сейчас не срабатывает.
Приаттачиваю скрин диалога и раскрытого UIATreeInspector-а.

Подскажите, куда копать?

upd. После "element:= resolve" добавил MouseMove, 100,100,100 - мышь поползла только когда закрыл открытый диалог. Получается что диалог в другом процессе и оно останавливает выполнение скрипта? Или я что то не так понял?

Post's attachments

1.png 76.2 kb, file has never been downloaded. 

You don't have the permssions to download the attachments of this post.

2

Re: AHK: UIA как получить доступ к диалогу?

Определить данные радиокнопки и послать туда клик, очевидно же, нет?

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

3 (изменено: meitx, 2025-01-26 17:57:05)

Re: AHK: UIA как получить доступ к диалогу?

teadrinker
Делал resolve.FindFirstBy("ClassName=QRadioButton AND Name=Uniform",,2) потом и .click() ему посылал и через element:= resolve.FindFirstBy("QRadioButton AND Name=Uniform",,2) element.GetCurrentPatternAs("Invoke").Invoke() достучаться пытался, ноль реакции.

4

Re: AHK: UIA как получить доступ к диалогу?

Я бы вообще не парился так, если интерфейс меняется то кто знает что будет после очередной обновы? Если кнопки и поля ввода (или что там нужно?) без изменений - можно через поиск картинки / пикселя всё сделать.

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

5

Re: AHK: UIA как получить доступ к диалогу?

__Михаил__
Нужно найти радио с параметрами совпадающими ClassName=QRadioButton AND Name=Uniform Split (и там всякое ещё) и сделать его включить его вместо включеного по умолчанию, проблема в том что я его вроде как ищу но оно не находится.

6

Re: AHK: UIA как получить доступ к диалогу?

Наверно неправильно как-то ищете. Если полный код выложите, будет понятнее.

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

7

Re: AHK: UIA как получить доступ к диалогу?

teadrinker
Да он собственно практически весь уже и выложен. Всякую закоментареную дребедень просто убрал.

$#RButton::
{

	MouseClick, right
	UIA := UIA_Interface()
	;UIA.AutoSetFocus := false 
	resolve:= UIA.ElementFromHandle(WinExist("ahk_exe CLO_Standalone_OnlineAuth_x64.exe")) 
	element:= resolve.FindFirstBy("ClassName=QAction AND Name=Split").Click()
	
	Sleep, 100
	;Send, {TAB 4}{DOWN 2}{SPACE}
	
	element:= resolve.FindFirstBy("ClassName=QRadioButton AND Name=Uniform Split",,2).Click()
	;element.GetCurrentPatternAs("Invoke").Invoke()
	;element.GetCurrentPatternAs("Toggle").ToggleState()
}

8

Re: AHK: UIA как получить доступ к диалогу?

Так может 100 мс не хватает, чтобы окно появилось, нужно WinWait.

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

9

Re: AHK: UIA как получить доступ к диалогу?

teadrinker
Думаю там даже не с таймерами беда - после того как первый click() проходит и вызывается диалог все команды которые ниже останавливаются пока диалог не закрыт, я пару часов назад туда mousemove вставил, оно по закрытию диалога только выполнилось. Раньше с диалогами вызываемыми из ахк в uia не сталкивался и не особо представляю как с ними взаимодействовать. Запустить treewalker-а? Он тоже встанет пока диалог не закроется.

10

Re: AHK: UIA как получить доступ к диалогу?

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

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

11 (изменено: Malcev, 2025-01-27 07:23:10)

Re: AHK: UIA как получить доступ к диалогу?

Я эту библиотеку не копал, надо смотреть как автор отправляет клики, так как:

Invoke is an asynchronous call and must return immediately without blocking.
This behavior is particularly critical for controls that, directly or indirectly, launch a modal dialog when invoked. Any UI Automation client that instigated the event will remain blocked until the modal dialog is closed.

https://learn.microsoft.com/en-us/windo … tinginvoke

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.

https://learn.microsoft.com/en-us/windo … aultaction
Можно пробовать открывать диалог другим способом, например через controlclick, либо закрывать его из нового потока:
http://forum.script-coding.com/viewtopi … 37#p129537

12 (изменено: meitx, 2025-01-27 12:28:50)

Re: AHK: UIA как получить доступ к диалогу?

Malcev
Спасибо, попробовал диалог открыть по другому, колхоз получился конечно дикий но сработало

	element:= resolve.FindFirstBy("ClassName=QAction AND Name=Split")
	loc := element.BoundingRectangle
	CoordMode, Mouse
	Mousemove, loc.l+5, loc.t+5
	Send, {Enter}
	
	Sleep, 100
	Send, {TAB 4}{DOWN 2}{SPACE}

Что интересно, если Send, {enter} заменить на Click то в открывшемся диалоговом окне опять не сработают send tab блаблабла.

Буду пытаться кадавра этого из табов во что то адекватное превратить