1

Тема: AHK: Определить наличие текста контрола, если его class меняется.

Требуется определить присутствует ли в каком-либо из контролов запущенной программы определенный текст, например, фраза "Форматированный текст". Это нетрудно сделать зная имя/classNN/HWND контрола. Как быть если эти значения контрола меняются после каждого нового запуска программы, и их нельзя определить раз и навсегда? При этом нужно избежать наведение курсора и определение координат контрола. Кстати, AhkSpy показывает текст из этого контрола в своей вкладке Window Text среди других. Какие варианты возможны?
Для своей задачи пока сделал так. Взял во внимание то, что хотя и classNN контрола всегда другой, но все-таки некоторая часть его остаётся постоянной. Отсюда следующий код:

WinGet, List, ControlList
RegExMatch(List, "AWL:\w{4}0000:80:0:0:0:02", ControlName)
	MsgBox, %ControlName%
ControlGetText, txt, %ControlName%, ahk_class FineReader15MainWindowClass,
;	MsgBox %txt%
If txt != Форматированный текст
{
	MsgBox Установите тип сохранения: Форматированный текст.
	Return
}
	MsgBox Продолжим...

Пока (сегодня) это срабатывает. Но уверенности, что class контрола всегда будет укладываться в составленную регулярку, нет. Вопрос: можно ли все это сделать более надежным? Для моей задачи даже не важно в каком контроле эта фраза будет находиться, важно лишь знать есть она или нет.

2

Re: AHK: Определить наличие текста контрола, если его class меняется.

В AhkSpy есть
https://i.imgur.com/2eKYYIB.png
если путь всегда одинаковый, то можно по нему.

stokber пишет:

Кстати, AhkSpy показывает текст из этого контрола в своей вкладке Window Text среди других.

stokber пишет:

Для моей задачи даже не важно в каком контроле эта фраза будет находиться, важно лишь знать есть она или нет.

Так это просто команда WinGetText, проверяйте ей наличие текста.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

3 (изменено: stokber, 2020-11-18 21:36:07)

Re: AHK: Определить наличие текста контрола, если его class меняется.

serzh82saratov пишет:

просто команда WinGetText

Спасибо! Все оказалось так просто.

4

Re: AHK: Определить наличие текста контрола, если его class меняется.

Если я вам помог, отпишитесь всегда ли путь одинаковый, нужна статистика.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

5

Re: AHK: Определить наличие текста контрола, если его class меняется.

Решил свою задачу с помощью подсказанной вами команды WinGetText.
Путь, если я правильно понял, все же разный. После клика по Get path в области окна Control Path следующее:
1-й запуск:
↓  14  ▪  0x0109D6  ▪  AWL:740B0000:8:10003:1900015:0:0  ▪  FineReaderOCR.exe
2-й запуск:
↓  14  ▪  0x0804B4  ▪  AWL:741C0000:8:10003:1900015:0:0  ▪  FineReaderOCR.exe
К сожалению ничего не нашел в сети о том, как можно воспользоваться значением Control Path.

6

Re: AHK: Определить наличие текста контрола, если его class меняется.

stokber пишет:

Путь, если я правильно понял, все же разный

Нет одинаковый, 14.

stokber пишет:

К сожалению ничего не нашел в сети о том, как можно воспользоваться значением Control Path.

В описании есть ссылка.


hwnd := ChildFromPath(14, WinExist("ahk_exe FineReaderOCR.exe")) 
ControlGetText, txt, , ahk_id %hwnd%
MsgBox %txt%

ChildFromPath(str, hwnd) 
{
	Static GW_HWNDNEXT := 2, GW_CHILD := 5
	hwnd := DllCall("GetWindow", "Ptr", hwnd, UInt, GW_CHILD, "Ptr")
	arr := StrSplit(str, "."), off := 1, i := 1
	Loop 
	{
		If (i = arr[off])
		{
			If (off = arr.Count())
				return hwnd
			hwnd := DllCall("GetWindow", "Ptr", hwnd, UInt, GW_CHILD, "Ptr"), ++off, i := 1 
		}
		Else If (++i) && !(hwnd := DllCall("GetWindow", "Ptr", hwnd, UInt, GW_HWNDNEXT, "Ptr"))
			return   
	}
} 

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

7

Re: AHK: Определить наличие текста контрола, если его class меняется.

В коде в вашем последнем посте, честно говоря , не особо разобрался. Запустил скрипт. Окно MsgBox пусто.
На самом деле после клика по Get path в области окна Control Path две строки:
3.14  ▪  0x03050E  ▪  FineReader15MainWindowClass  ▪  FineReaderOCR.exe
↓  14  ▪  0x0109F0  ▪  AWL:74350000:8:10003:1900015:0:0  ▪  FineReaderOCR.exe
Вчера указал только нижнюю строку, так как именно после клика по кнопке flash на этой строке мигала рамка области, в которую входил и мой целевой контрол. Решил, что этого достаточно.
Числа 3.14 и 14 постоянны.

8

Re: AHK: Определить наличие текста контрола, если его class меняется.


hwnd := ChildFromPath("3.14", WinExist("ahk_exe FineReaderOCR.exe")) 
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

9

Re: AHK: Определить наличие текста контрола, если его class меняется.

Заменил строку. По прежнему пусто.

10

Re: AHK: Определить наличие текста контрола, если его class меняется.

Наверное есть ещё окна FineReaderOCR, попробуйте так, когда окно будет активно.


hwnd := ChildFromPath("3.14", WinExist("A")) 
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

11

Re: AHK: Определить наличие текста контрола, если его class меняется.

Нет. Не срабатывает.

12

Re: AHK: Определить наличие текста контрола, если его class меняется.

Или так.



hwnd := ChildFromPath("3.14", WinExist("ahk_class FineReader15MainWindowClass")) 
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

13

Re: AHK: Определить наличие текста контрола, если его class меняется.

И так не срабатывает.

14

Re: AHK: Определить наличие текста контрола, если его class меняется.

Значит где-то ошибка, смотреть надо.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

15

Re: AHK: Определить наличие текста контрола, если его class меняется.

Я вчера этот код запускал.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

16

Re: AHK: Определить наличие текста контрола, если его class меняется.

В принципе через WinGetText все работает. Попробую на досуге еще с Get path покопаться. Ещё раз спасибо.

17 (изменено: vlad1986, 2020-11-20 16:47:24)

Re: AHK: Определить наличие текста контрола, если его class меняется.

serzh82saratov

Подскажите пожалуйста, если AhkSpy в Get path показывает несколько строк, то какой вариант выбирается?


↓ 1.1.1.1.9  ▪ 
↓ 1.1.1.9  ▪ 
↓ 1.1.9  ▪ 
↓ 1.9  ▪ 
↓  9  ▪ 

18

Re: AHK: Определить наличие текста контрола, если его class меняется.

Если надо относительно окна, то первый верхний.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui