Бьюсь уже неделю, не получается получить некоторую информацию об окне.
Есть программа, в которой формируются окна (внутри основного окна программы). Эти окна идут под титлом основного окна, но отличаются позицией на экране и инстансом. Иногда в них появляются элементы управления (кнопки "Принять", "Отмена" и т.д.). При работе срипта нужно четко понимать, в каком состоянии сейчас основная программа, какие окна открыты, и в зависимости от ситуации выполнять некоторые действия. Пробовал делать по поиску изображений на экране, но разрешение экрана на станциях разное, сделаные картинки на одном компе работают, на другом нет. Более того иногда перестают работать и на том компе на котором сделаны картинки. Визуально вроде отличий не видно, но программа не находит пока не переснимешь картинку. Остается только работа с окнами.
Пока отрабатываю на "кошках" (окна каспера).
WinList выдает только титл и заголовок.
По заголовку научился определять положение и размер окон на экране функцией WinGetPos. Открыто 3 окна с одинаковым титлом, отличаются заголовком , программа выдает позиции всех трех окон.
Но при попытке найти на открытом окне элемент управления, или хотя бы класс окна - ничего. Хотя Window Info показывает элемент управления под тем же заголовком, но имеющий класс Button, инстанс 1, положение на экране относительно верхней левой точки окна, размеры кнопки... Какой функцией можно выцарапать эту информацию из системы - ума не приложу. В поиске то же толком ничего такого нет, были ссылки на указание в титле класса или инстанса, но при попытке указать функция WinGetPos возвращает ошибку. Команды вроде $apos1=WinGetPos("[CLASS:Button]") сразу валят ошибку.
Если есть функция дающая возможность получить любую информацию об окне, которую показывает Window Info - ткните носом, куда копать. Если функция из основных прописана на сайте - объясните как ею воспользоваться, или в примеры использования.
Ниже - фрагмент, который сейчас работает, но он только находит открытые окна каспера и выводит их положения на экране. Информация пишется в лог-файл.
Есть программа, в которой формируются окна (внутри основного окна программы). Эти окна идут под титлом основного окна, но отличаются позицией на экране и инстансом. Иногда в них появляются элементы управления (кнопки "Принять", "Отмена" и т.д.). При работе срипта нужно четко понимать, в каком состоянии сейчас основная программа, какие окна открыты, и в зависимости от ситуации выполнять некоторые действия. Пробовал делать по поиску изображений на экране, но разрешение экрана на станциях разное, сделаные картинки на одном компе работают, на другом нет. Более того иногда перестают работать и на том компе на котором сделаны картинки. Визуально вроде отличий не видно, но программа не находит пока не переснимешь картинку. Остается только работа с окнами.
Пока отрабатываю на "кошках" (окна каспера).
WinList выдает только титл и заголовок.
По заголовку научился определять положение и размер окон на экране функцией WinGetPos. Открыто 3 окна с одинаковым титлом, отличаются заголовком , программа выдает позиции всех трех окон.
Но при попытке найти на открытом окне элемент управления, или хотя бы класс окна - ничего. Хотя Window Info показывает элемент управления под тем же заголовком, но имеющий класс Button, инстанс 1, положение на экране относительно верхней левой точки окна, размеры кнопки... Какой функцией можно выцарапать эту информацию из системы - ума не приложу. В поиске то же толком ничего такого нет, были ссылки на указание в титле класса или инстанса, но при попытке указать функция WinGetPos возвращает ошибку. Команды вроде $apos1=WinGetPos("[CLASS:Button]") сразу валят ошибку.
Если есть функция дающая возможность получить любую информацию об окне, которую показывает Window Info - ткните носом, куда копать. Если функция из основных прописана на сайте - объясните как ею воспользоваться, или в примеры использования.
Ниже - фрагмент, который сейчас работает, но он только находит открытые окна каспера и выводит их положения на экране. Информация пишется в лог-файл.
Код:
#Include <WinAPIEx.au3>
HotKeySet("{ESC}","MyExit")
$log_f="log_"&@YEAR&@MON&@MDAY&"_"&@HOUR&@MIN&@SEC&".txt"
$hFile=FileOpen($log_f,1)
$okno="Сообщение системы Kaspersky Security Center 13" ;заголовок окон с сообщениями.
While 1
$var = WinList($okno) ; получаем список окон
For $n = 1 to $var[0][0]
FileWrite($hFile, "Win: "&$n&" Name: "&$var[$n][0]&" HWND: "&$var[$n][1]&@CRLF)
$apos=WinGetTitle($okno) ;,"[CLASS:Button]")
$apos1=WinGetPos($var[$n][1])
if @error then
FileWrite($hFile, "Win: not found"&@CRLF)
Else
FileWrite($hFile, "Win: "&$var[0][0]&" Pos: "&$apos1[0]&"x"&$apos1[1]&" Razm: "&$apos1[2]&"x"&$apos1[3]&@CRLF)
EndIf
Next
sleep (10000)
FileWrite($hFile, "Sleep: 10 sec."&@CRLF)
Wend
Func MyExit()
if $hFile <>-1 then FileClose($hFile)
Exit
EndFunc