Что нового

Как получить полную информацию об открытых окнах (cопоставимую с Window Info)

Aleks

Новичок
Сообщения
6
Репутация
0
Бьюсь уже неделю, не получается получить некоторую информацию об окне.
Есть программа, в которой формируются окна (внутри основного окна программы). Эти окна идут под титлом основного окна, но отличаются позицией на экране и инстансом. Иногда в них появляются элементы управления (кнопки "Принять", "Отмена" и т.д.). При работе срипта нужно четко понимать, в каком состоянии сейчас основная программа, какие окна открыты, и в зависимости от ситуации выполнять некоторые действия. Пробовал делать по поиску изображений на экране, но разрешение экрана на станциях разное, сделаные картинки на одном компе работают, на другом нет. Более того иногда перестают работать и на том компе на котором сделаны картинки. Визуально вроде отличий не видно, но программа не находит пока не переснимешь картинку. Остается только работа с окнами.
Пока отрабатываю на "кошках" (окна каспера).
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
 

All2khoff

Продвинутый
Сообщения
347
Репутация
65
Модальные окна это довольно болезненное место, они не есть отдельное окно, а просто прорисовка "внутри окна", с аналогичным я столкнулся когда пытался работать с 1с.
Самый оптимальный способ(по моему скромному мнению) это после каждого действия определять изменения в заданном диапазоне, например проверять изменения в цвете пикселей по возможным координатам дочернего окна(жрет вполне приличное количество ресурсов). например перед кликом делать скриншот, а затем после клика по кнопке "параметры" делать новый и проверять изменения между картинками. таким образом определяя предположительное положение окна, как следствие мы получаем примерные координаты нужных нам кнопок и параметров.
чем более точные данные мы получаем, тем более точно в итоге можно кликать по кнопкам.
в идеале конечно нужно чтобы все дочерние окна открывались в том виде в котором они подразумеваются "по умолчанию", если же были вмешательства... например окно запоминает свое старое местоположение, например окно переместил пользователь и/или статус ("развертнуть на весь экран" как вариант), то предусмотреть такой вариант и чем глубже и вариативней тем лучше.
Но это все меркнет перед файлом конфигурации настроек которые можно импортировать в антивирус(ибо по коду можно догадаться что работаем с окнами антивируса Касперского), в том числе через командную строку во время установки(крайне рекомендую попробовать этот вариант(сначала на шаблоне заготавливаем параметры антивируса, затем экспортируем его в файл настроек, а затем во время установки используем этот файл как эталон), чем на каждой рабочей станции менять настройки путем AutoIT), тем более Касперский крайне негативно реагирует на работу эмуляторов действий пользователя, как и на настройку через удаленный доступ типа Anidesk, AmmyAdmin, Teamviewer, Dameware, Radmin и аналогами, без определенных предварительных настроек, а именно просто блокирует попытки нажать на кнопку.
если же нужно обойти ограничения у уже установленной защиты от вторжения, то в первую очередь нужно решить проблему "самозащиты", а уже затем проводить настройки. Даже просто закрытие сообщения о завершении обновления и/или завершения проверки системы защищены.
К стати их можно просто выключить и пользователь не будет получать "раздражающих" сообщений о действиях антивируса.
В любом случае вы очень грамотно подходите к озвучиванию вопросов, что говорит от вашей высокой грамотности как специалиста, я крайне импонирую вашему подходу к постановке задачи. Если я описал какие-то неподходящие сценарии, прошу прощения, лет 5 не работал с Касперским, но подозреваю что параметры установки всё-таки можно передать в командной строке.
 
Автор
A

Aleks

Новичок
Сообщения
6
Репутация
0
Модальные окна это довольно болезненное место, они не есть отдельное окно, а просто прорисовка "внутри окна", с аналогичным я столкнулся когда пытался работать с 1с.
Самый оптимальный способ(по моему скромному мнению) это после каждого действия определять изменения в заданном диапазоне, например проверять изменения в цвете пикселей по возможным координатам дочернего окна(жрет вполне приличное количество ресурсов). например перед кликом делать скриншот, а затем после клика по кнопке "параметры" делать новый и проверять изменения между картинками. таким образом определяя предположительное положение окна, как следствие мы получаем примерные координаты нужных нам кнопок и параметров.
чем более точные данные мы получаем, тем более точно в итоге можно кликать по кнопкам.
в идеале конечно нужно чтобы все дочерние окна открывались в том виде в котором они подразумеваются "по умолчанию", если же были вмешательства... например окно запоминает свое старое местоположение, например окно переместил пользователь и/или статус ("развертнуть на весь экран" как вариант), то предусмотреть такой вариант и чем глубже и вариативней тем лучше.
Но это все меркнет перед файлом конфигурации настроек которые можно импортировать в антивирус(ибо по коду можно догадаться что работаем с окнами антивируса Касперского), в том числе через командную строку во время установки(крайне рекомендую попробовать этот вариант(сначала на шаблоне заготавливаем параметры антивируса, затем экспортируем его в файл настроек, а затем во время установки используем этот файл как эталон), чем на каждой рабочей станции менять настройки путем AutoIT), тем более Касперский крайне негативно реагирует на работу эмуляторов действий пользователя, как и на настройку через удаленный доступ типа Anidesk, AmmyAdmin, Teamviewer, Dameware, Radmin и аналогами, без определенных предварительных настроек, а именно просто блокирует попытки нажать на кнопку.
если же нужно обойти ограничения у уже установленной защиты от вторжения, то в первую очередь нужно решить проблему "самозащиты", а уже затем проводить настройки. Даже просто закрытие сообщения о завершении обновления и/или завершения проверки системы защищены.
К стати их можно просто выключить и пользователь не будет получать "раздражающих" сообщений о действиях антивируса.
В любом случае вы очень грамотно подходите к озвучиванию вопросов, что говорит от вашей высокой грамотности как специалиста, я крайне импонирую вашему подходу к постановке задачи. Если я описал какие-то неподходящие сценарии, прошу прощения, лет 5 не работал с Касперским, но подозреваю что параметры установки всё-таки можно передать в командной строке.
Благодарю за развернутый ответ, но к сожалению вариант отслеживания изменений не подходит. На каспере я только тренируюсь, он загружен всегда, и оповещения от сервера каспера валятся штук по 5 в день (в основном напоминалки от админа о необходимости проветривания помещений). Что касается целевого программного комплекса - был рабочий кликер, который работал именно по контролью окон без поиска фрагментов изображений на экране, но ПО писалось человеком из другого региона, под другой техпроцесс, и специалиста писавшего ПО найти так и не удалось. Потому собственно и озадачился вопросом определения через информацию об окнах. Хорошо, пусть модальное окно не является как таковым отдельным окном, но ведь Window Info дает о нем информацию. Как собственно и в окне от каспера... В зависимости от того, куда наведен курсор Window Info - появляется 3 разных варианта информации об окне (Приложу скриншоты 1 - курсор на шапке, 2 - курсор на кнопке "ОК", 3 - курсор на окне с текстом)Kasp_1.jpgKasp_2.jpgKasp_3.jpg.
Так вот, если Window Info эту информацию показывает - по идее должен быть и функционал в AutoIt позволяющий эту информацию получить. И судя по тому, что есть ПО заточенное под работу другого техпроцесса на том же программном комплексе, что требуется мне - кто то эти окна все же успешно освоил (во всяком случае извлечение номера инстанса, у каспера он или пуст или равен единице, а в целевом ПО меняется от 1 до нескольких сотен в зависимости от "ветки" и открытого окна выбранного техпроцесса). Жаль специалиста найти не удалось.
В целом на поиске картинок ПО работает, но нужна определенная подготовка от оператора. Оператор должен запустить программу, выбрать нужную ветку, открыть техпроцесс и запустить программу. Если все в порядке - ночью пока нет нагрузки на корпоративную сеть программа выполнит техпроцесс по ключевым точкам найденным при пробном прогоне при запуске ПО оператором, но есть нюанс. Программный комплекс не очень стабилен, Время от времени он может терять связь с ЦОД-ом, и аварийно закрываться. А при закрытом программном комплексе кликер ничего не сделает. Нужно запускать комплекс, выходить на требуемый техпроцесс ища и выбирая ветку, переходя по нескольким меню... В общем для работы по фрагментам изображений задача вполне посильная, но косяк с тем, что готовые фрагменты, по которым поиск работал пол часа назад, а после перезапуска ПО ни в какую не работает - превращает обычный ночной перезапуск ПО в ту еще лотерею. Так хоть по открытым инстансам можно определить насколько удачно прошел перезапуск, и как проходит продвижение по менюшкам к нужному техпроцессу.
Выход оператора на рабочее место ночью, как и удаленный доступ из дома - вообще не рассматриваются.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
если Window Info эту информацию показывает - по идее должен быть и функционал в AutoIt позволяющий эту информацию получить
Au3Info для того и сделана, чтобы показывать информацию, которую можно получить с помощью AutoIt.
Существуют аналоги Au3Info, написанные на AutoIt: Control Viewer или wInformer. С исходниками.

В зависимости от того, куда наведен курсор Window Info
Именно! Au3Info, так же, как и аналоги, получают информацию об элементе по координатам элемента (координатам курсора мыши). Для этого есть специальные функции. Например
Код:
_WinAPI_WindowFromPoint()

Но совсем другое - найти этот элемент путём перечисления окон. Сначала нужно найти главное окно, затем перечислить дочерние элементы, потом отфильтровать найденные по необходимым параметрам. И для облегчения всего этого и был создан AutoIt. Просто почитайте справочку по функциям Win* и Control*, выберите нужные вам функции и используйте их.
 
Автор
A

Aleks

Новичок
Сообщения
6
Репутация
0
Au3Info для того и сделана, чтобы показывать информацию, которую можно получить с помощью AutoIt.
Существуют аналоги Au3Info, написанные на AutoIt: Control Viewer или wInformer. С исходниками.


Именно! Au3Info, так же, как и аналоги, получают информацию об элементе по координатам элемента (координатам курсора мыши). Для этого есть специальные функции. Например
Код:
_WinAPI_WindowFromPoint()

Но совсем другое - найти этот элемент путём перечисления окон. Сначала нужно найти главное окно, затем перечислить дочерние элементы, потом отфильтровать найденные по необходимым параметрам. И для облегчения всего этого и был создан AutoIt. Просто почитайте справочку по функциям Win* и Control*, выберите нужные вам функции и используйте их.
Благодарю! Пошел ковырять CV... С наглядным примером - всегда проще работать.
 
Верх