Поиск дочернего окна

Обсуждение программ nnCron и nnCron LITE

Re: Поиск дочернего окна

Postby Burunduk » Tue, 15 Oct 2013, 09:37

Нужное дочернее окно находится, но почему-то не активируется.

Code: Select all
#( SYNCHR_Cockpit
RunOnce
NoDel
Time: 0 11 14 10 * 2013
Action:
WIN-EXIST: "GPSCockpit*"
IF
   MSG: "GPSCockpit* существует."
   WIN-ACTIVATE: "GPSCockpit*"   \  активируем главное окно GPSCockpit*
   WIN-ACTIVE: "GPSCockpit*"     \  проверяем, активировалось ли?
   IF
      \ MSG: "Окно GPSCockpit* активировано"   
      \ MSG: "Просматриваем дочерние классы."
      FOR-CHILD-WINDOWS: "*"
         \ ... выполняем работу с дочерними окнами
         \ WIN-CHILD-HWND GET-WCLASS MsgBox
         WIN-CHILD-HWND GET-WTEXT S" GPS Information" COMPARE 0=
         IF
            \ MSG: "Найдено окно GPS Information"   
            WIN-ACTIVATE: "GPS Information"  \  активируем окно
            PAUSE: 10000
            WIN-ACTIVE: "GPS Information"     \  проверяем, активировалось ли?
            IF
               \ MSG: "Окно GPS Information активировано"   
               WIN-CLICK: "GPS Information" "Sync PC time"
               MSG: "Окно GPS Information кликнуто"   
            ELSE
               MSG: "Не удалось активировать окно GPS Information"   
            THEN
         THEN
      ;FOR-CHILD-WINDOWS
   ELSE
      MSG: "Не удалось активировать окно GPSCockpit*"   
   THEN
ELSE
   MSG: "GPSCockpit* не найден."
THEN

MSG: "Конец задачи."
)#



Выводит "Не удалось активировать окно GPS Information"
и
"Конец задачи."
Burunduk
 
Posts: 73
Joined: Thu, 03 Oct 2013, 06:57

Re: Поиск дочернего окна

Postby VoidVolker » Tue, 15 Oct 2013, 11:56

Code: Select all
WIN-CHILD-HWND GET-WTEXT S" GPS Information" COMPARE 0=

GPS Information - это дочернее окно? Ну конечно его нельзя вывести на передний план, т.к. оно ДОЧЕРНЕЕ. Т.е. объясняю простым языком: в винде существует два основных вида окон(условно конечно) — это окно программы или просто "окно". Оно является окном верхнего уровня, если быть точнее - то дочерним по отношению к окну нулевого уровня <Desktop> (рабочий стол). Так вот, у окна программы могут быть дочерние окна и вот эти дочерние окна не входят в список окон верхнего уровне. У окон программ и их дочерних окон свойства несколько разные. Например дочернее окно не может быть на переднем плане рабочего стола, т.к. оно не находится на рабочем столе (его нет среди дочерних окон рабочего стола) и оно не может находится за пределами родительского окна. Надеюсь теперь понятно, что такие команды как WIN-ACTIVATE, WIN-ACTIVE и многие другие работают со списком окон верхнего уровня / рабочего стола? Т.е. с окнами приложений. Ибо проход по всем дереву окон может растянуться на несколько тысяч апи-вызовов. Поэтому для дочерних окон используется отдельный цикл, который ищет все дочерние окна конкретного окна.
Рекомендую ознакомиться с оконной системой ОС Windows более подробно.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Поиск дочернего окна

Postby Aveiro » Tue, 15 Oct 2013, 20:28

Если окно которое ищется видимое, рекомендовал бы добавить условие ниже, все скрытые окна будут отсечены, что облегчит поиск...

Code: Select all
WIN-HWND VISIBLE?

Если совместно с поиском :
Code: Select all
WIN-EXIST: "Искомое окно" WIN-HWND VISIBLE? AND
nncron.exe v 1.93b15 Build 1177 08.02.2016
tm.exe v 1.93b15 Build 604 08.02.2016
Aveiro
 
Posts: 222
Joined: Tue, 06 Jul 2010, 21:19

Re: Поиск дочернего окна

Postby Burunduk » Wed, 16 Oct 2013, 05:40

VoidVolker wrote:Например дочернее окно не может быть на переднем плане рабочего стола, т.к. оно не находится на рабочем столе (его нет среди дочерних окон рабочего стола) и оно не может находится за пределами родительского окна.

В программе GPSCockpit от главного окна происходит дочернее окно класса MDIClient, это центральная панель, которая напоминает рабочий стол Виндоус. На ней могут открываться одно или несколько СУБДОЧЕРНИХ окон. Пользователь может выбирать нужное окно. При этом оно выделяется, заголовок становится ярким(подобно активированию окон первого уровня на рабочем столе), и его можно таскать по центральной панели или даже менять размеры. Остальные дочерние окна при этом выглядят неактивными. Мне нужно нажать кнопку на одном из субдочерних окон. Для этого нужно проимитировать действия пользователя по выделению субдочернего окна и по нажатию кнопки.

VoidVolker wrote:Поэтому для дочерних окон используется отдельный цикл, который ищет все дочерние окна конкретного окна.


Судя по сообщениям нужное субдочернее окно находится, но слово WIN-CLICK: "%FOUND-CHILD-WINDOW%" "Sync PC time" не срабатывает. Видимо сначала окно надо как-то выделить. Это я и пытался сделать при помощи WIN-ACTIVATE.
Burunduk
 
Posts: 73
Joined: Thu, 03 Oct 2013, 06:57

Re: Поиск дочернего окна

Postby VoidVolker » Wed, 16 Oct 2013, 08:06

Burunduk wrote:В программе GPSCockpit от главного окна происходит дочернее окно класса MDIClient, это центральная панель, которая напоминает рабочий стол Виндоус. На ней могут открываться одно или несколько СУБДОЧЕРНИХ окон. Пользователь может выбирать нужное окно. При этом оно выделяется, заголовок становится ярким(подобно активированию окон первого уровня на рабочем столе), и его можно таскать по центральной панели или даже менять размеры.

А ничего, что дочерние окна не могут выйти за границы родительского окна? Так вот, судя по всему, эта панель является не дочерним окном, а окном верхнего уровня - да, их может быть несколько.
http://s0m.narod.ru/iws.html - вот тут есть отличный сканер окон, он умеет показывать все дерево окон всей системы.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Поиск дочернего окна

Postby Burunduk » Wed, 16 Oct 2013, 09:41

VoidVolker wrote:А ничего, что дочерние окна не могут выйти за границы родительского окна? Так вот, судя по всему, эта панель является не дочерним окном, а окном верхнего уровня - да, их может быть несколько.http://s0m.narod.ru/iws.html - вот тут есть отличный сканер окон, он умеет показывать все дерево окон всей системы.


Дерево окон смотрел WinSpy++(не встроеный в Крон) и InqSoft

Не могу понять, как можно сюда вставить принт-скрин(в формате jpeg)

Получается из десктопа растет главное окно(одно),
из него MDIClient, контрол-бары и стаус-бар
из MDIClient растут окна GPS Information и другие подобные
из GPS Information растёт какое-то диалоговое окошко #32770 (Dialog)
а из него пара баттонов "Sync PC Time" и "Offset to UTC" и куча статик-текстов
Burunduk
 
Posts: 73
Joined: Thu, 03 Oct 2013, 06:57

Re: Поиск дочернего окна

Postby AlikasS » Wed, 16 Oct 2013, 09:43

начни с самого простого,
посмотри хендл дочернего окна в котором надо нажать кнопку (WinSpy или что либо другое),
запусти консоль крона и набери в ней
Code: Select all
хендл окна в виде цифры и далее N>S S" Sync PC time*" WIN-CLICK

нажми ввод. :-)
отработало?

как 2 вариант в консоли крона
Code: Select all
хендл окна в виде цифры и далее N>S CRLF WIN-SEND-KEYS

здесь просто энтер посылается в окно

P.S. однозначно дочернее окно идентифицируется по тексту и классу?
или их несколько одинаковых и только хендлы разные
User avatar
AlikasS
 
Posts: 1434
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: Поиск дочернего окна

Postby VoidVolker » Wed, 16 Oct 2013, 10:42

Burunduk wrote:Не могу понять, как можно сюда вставить принт-скрин(в формате jpeg)

Ссылкой или превьюшкой с фотохостинга.
Винсканер умеет сохранять дерево окон в текстовый файл, и даже скриншоты умеет делать. Да и вообще - там же в дереве окон видно всю структуру.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Поиск дочернего окна

Postby Burunduk » Wed, 16 Oct 2013, 14:48

Burunduk
 
Posts: 73
Joined: Thu, 03 Oct 2013, 06:57

Re: Поиск дочернего окна

Postby Burunduk » Thu, 17 Oct 2013, 05:22

AlikasS wrote:хендл окна в виде цифры и далее N>S S" Sync PC time*" WIN-CLICKнажми ввод. отработало?


Нет.

Вот вид приложения

Image
http://ipic.lv/i3/3d6cce9c/5b7b48f30b02202.jpg

А это окна и классы


http://ipic.lv/i4/594a4450/545cfb3c13a17f8.jpg

Классы окон GPS Information и Signal Quality похожи, но хвостики разные.(зелёные метки)
Но внутри каждого из этих окон еще есть окно стиля диалог. Вот у них класс одинаковый. (Красные метки)

Если посмотреть на окна средствами языка AutoIt,
то у окон класса #32770 разные параметры
ClassNN #327701 #327702
и
INSTANCE 1 2

Image
http://ipic.lv/i5/a32a3cba/233b7433b4e4a51.jpg
Burunduk
 
Posts: 73
Joined: Thu, 03 Oct 2013, 06:57

Re: Поиск дочернего окна

Postby Burunduk » Thu, 17 Oct 2013, 06:21

AlikasS wrote:P.S. однозначно дочернее окно идентифицируется по тексту и классу?или их несколько одинаковых и только хендлы разные


Для проверки написал

Code: Select all
Action:
WIN-EXIST: "GPSCockpit*"
IF
   WIN-ACTIVATE: "GPSCockpit*"   \  активируем главное окно GPSCockpit*
   WIN-ACTIVE: "GPSCockpit*"     \  проверяем, активировалось ли?
   IF
      FOR-CHILD-WINDOWS: "*"
         \ ... выполняем работу с дочерними окнами
         WIN-CHILD-HWND GET-WCLASS S" #32770" COMPARE 0=
         IF
            WIN-CHILD-HWND N>S MsgBox
            S" Имя окна %FOUND-CHILD-WINDOW%" MsgBox
         THEN
      ;FOR-CHILD-WINDOWS
   ELSE
      MSG: "Не удалось активировать окно GPS Information"   
   THEN
ELSE
   MSG: "GPSCockpit* не найден."
THEN

MSG: "Конец задачи."


Как и ожидалось из анализа дерева окон, находит два хэндла окон класса "#32770". Одно вложенное в окно GPS Information, другое в вложенное в окно SignalQuality.
Заголовки окон не удалось вывести, так как код S" Имя окна %FOUND-CHILD-WINDOW%" MsgBox
печатает просто %FOUND-CHILD-WINDOW%

Видно проблема в том, что вложенные #32770 не могут быть различены по классу и заголовку.
В языке AutoIT для решения подобных проблем введена дополнительная идентификация окон по параметрам ClassNN и INSTANCE. Вот они у этих окон разные.
Интересно, что AutoIT WindowInfo относит 32770 к разряду CONTROL. Получается это вроде как Control, который содержит другие контролы - баттоны и статик тексты.
Burunduk
 
Posts: 73
Joined: Thu, 03 Oct 2013, 06:57

Re: Поиск дочернего окна

Postby AlikasS » Thu, 17 Oct 2013, 06:28

Code: Select all
WIN-CLICK: "GPSCockpit - GPS Information" "Sync PC time"
User avatar
AlikasS
 
Posts: 1434
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: Поиск дочернего окна

Postby Burunduk » Thu, 17 Oct 2013, 06:49

AlikasS wrote:
Code: Select all
WIN-CLICK: "GPSCockpit - GPS Information" "Sync PC time"


Спасибо! ПОЧТИ заработало.

Написал такой код

Code: Select all
#( SYNCHR_MAIN_Cockpit
RunOnce
NoDel
Time: 0 11 14 10 * 2013
Action:
WIN-EXIST: "GPSCockpit*"
IF
   WIN-ACTIVATE: "GPSCockpit*"   \  активируем главное окно GPSCockpit*
   WIN-ACTIVE: "GPSCockpit*"     \  проверяем, активировалось ли?
   IF
      WIN-CLICK: "GPSCockpit - GPS Information" "Sync PC time"
   ELSE
      MSG: "Не удалось активировать окно GPS Information"   
   THEN
ELSE
   MSG: "GPSCockpit* не найден."
THEN

MSG: "Конец задачи."
)#


Первая проблема:

Если приложение GPSCockpit свёрнуто, то первый запуск задачи только выводит его на передний план, т.е. делает активным.
Но синхронизации не происходит. Хотя баттон выглядит активным.

При втором запуске уже происходит нажатие баттона и реальная синхронизация.

Вторая проблема:
Оператор может оставить приложение с фокусом в другом дочернем окне, например SignalQuality (или еще другие открыть и выбрать)
Тогда заголовок главного окна становится "GPSCockpit - SignalQuality" и т.п.
Burunduk
 
Posts: 73
Joined: Thu, 03 Oct 2013, 06:57

Re: Поиск дочернего окна

Postby AlikasS » Thu, 17 Oct 2013, 06:53

я вообще свернутое окно не поднимал. просто исполнил написанный код и время синхронизировалось
Code: Select all
#( SYNCHR_MAIN_Cockpit
RunOnce
NoDel
Time: 0 11 14 10 * 2013
Action:

      WIN-CLICK: "GPSCockpit*" "Sync PC time"

MSG: "Конец задачи."
)#
User avatar
AlikasS
 
Posts: 1434
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: Поиск дочернего окна

Postby Burunduk » Thu, 17 Oct 2013, 07:01

AlikasS wrote:я вообще свернутое окно не поднимал. просто исполнил написанный код и время синхронизировалось


У вас есть навигатор? Мне крупно повезло! :D

Интересно, что если фокус ввода брошен на окне SignalQuality, то синхронизуется с первого раза!

Сейчас попробую Ваш простейший вариант в разных сочетаниях.
Burunduk
 
Posts: 73
Joined: Thu, 03 Oct 2013, 06:57

PreviousNext

Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 1 guest

cron