Что нового

[Окна, Диалоги] Как найти Handle дочернего окна ?

Статус
Закрыто для дальнейших ответов.

KEO

Новичок
Сообщения
26
Репутация
0
Добрый день.
Исходные данные: открыто окно браузера FireFox, в нём запущен сайт (Вконтакте). И тут же на этой странице открыта онлайн-игрушка (Клондайк).

Известен Handle родительского окна:
Код:
Global $FireFox_Handle = WinGetHandle ("[Title:Клондайк - Mozilla Firefox; CLASS:MozillaWindowClass]")



При использовании программы AutoIT Window Info и наведении "прицела" на окно игры - показывает Class и Instance нужного мне дочернего окна.
[CLASS:GeckoFPSandboxChildWindow; INSTANCE:1]

Вопрос: каким образом, имея Handle основного окна и Class+Instance дочернего окна получить Handle этого дочернего окна ?

С одной стороны мне помогла следующая функция:
Код:
$Klondayk_Handle = _WinAPI_GetWindow ( $FireFox_Handle, $GW_CHILD )


Но при открытии другого параллельного окна FireFox - выдаёт ошибку. Да, меняется заголовок окна и можно сделать так:
Код:
Global $FireFox_Handle = WinGetHandle ("CLASS:MozillaWindowClass]")

То есть убрать Title и оставить только Class. Но всё равно не помогает.

Можно через функцию WinList. Но там такая же ситуация.

Иными словами: как мне найти handle конкретного(!) дочернего окна (имея его известные Class+Instance), зная Handle родительского окна ?

Надеюсь суть ясна. Заранее всем ответившим огромное спасибо.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
KEO [?]
найти handle конкретного(!) дочернего окна (имея его известные Class+Instance), зная Handle родительского окна
Код:
ControlGetHandle($FireFox_Handle, "", "GeckoFPSandboxChildWindow1")
 
Автор
K

KEO

Новичок
Сообщения
26
Репутация
0
Большое спасибо за подсказанную функцию. Как бы работает, но ...
Но возникла неприятность. Данная функция отрабатывает только тогда, когда я ищу handle родительского окна полностью (Title + Class):

Код:
Global $FireFox_Handle = WinGetHandle ("[Title:Клондайк - Mozilla Firefox; CLASS:MozillaWindowClass]")


Если я укаываю просто:
Код:
Global $FireFox_Handle = WinGetHandle ("[CLASS:MozillaWindowClass]")


то (при проверке) пишет, что родительский handle найден, а дочерний не хочет находиться. И это при том, что в данный момент открыто одно(!) окно FireFox с одной(!) закладкой (с Клондайком).

Используя MsgBox я проверил: с Title находит один handle, а без Title - совсем другой. Это при том, что закладка одна, окно FireFox тоже запущено одно.

Где я что не доглядел ? :smile:
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
KEO [?]
с Title находит один handle, а без Title - совсем другой
Всё правильно. Там два окна такого класса. Первым находится скрытое окно, которое без заголовка. Именно его дескриптор вы и получаете.
Добавьте заголовок или используйте только заголовок без класса
Код:
ControlGetHandle("Клондайк", "", "GeckoFPSandboxChildWindow1")
 
Автор
K

KEO

Новичок
Сообщения
26
Репутация
0
Ну вот так вообще не работает.

Открыто две закладки сейчас: Клондайк и вот этот форум.

Вот так получилось:
Код:
Global $Klondayk_Handle = ControlGetHandle("[Title:Клондайк - Mozilla Firefox]", "", "GeckoFPSandboxChildWindow1")


И то при условии, что закладка с Клондайк является в фокусе (активной).

А мне как раз смысл найти handle рабочей области онлайн-игры в закладке без наличия у неё фокуса (найти по классу GeckoFPSandboxChildWindow1).
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
KEO [?]
в закладке без наличия у неё фокуса
А это сразу нельзя было написать ?!
Попробуйте так
Код:
Opt("WinTitleMatchMode", 2)
ConsoleWrite(ControlGetHandle("Mozilla Firefox", "", "GeckoFPSandboxChildWindow1") & @LF)
 
Автор
K

KEO

Новичок
Сообщения
26
Репутация
0
Прошу прощения, наверное я сильно туплю, но вот тут я не совсем понял. Видит Бог - стараюсь понять изо всех сил. :smile:

Мне как бы нужно получить Handle в переменную.

Написал так:
Код:
Opt("WinTitleMatchMode", 2)
$Klondayk_Handle = ConsoleWrite(ControlGetHandle("Mozilla Firefox", "", "GeckoFPSandboxChildWindow1") & @LF)
MsgBox($MB_SYSTEMMODAL, "", "Klondayk_Handle = " & $Klondayk_Handle)


Выдал число, совсем не похожее на handle. Какое то число "19" выдал. :smile: Направьте на путь истинный - чего я опять сделал не так ?

И если не сложно, то буквально в двух словах: а для чего используется функция ConsoleWrite ? И для чего мы её пытаемся использовать в нашем случае ?
Почитал справку по этой функции - написано, что функция эта пишет данные в STDOUT-поток. Хм... Не понял, если честно. :smile:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
KEO [?]
Выдал число, совсем не похожее не handle
Поменяйте
Код:
$Klondayk_Handle = ConsoleWrite(ControlGetHandle("Mozilla Firefox", "", "GeckoFPSandboxChildWindow1") & @LF)
на
Код:
$Klondayk_Handle = ControlGetHandle("Mozilla Firefox", "", "GeckoFPSandboxChildWindow1")




Добавлено:
Сообщение автоматически объединено:

KEO [?]
Какое то число "19" выдал.
Это длина строки (кликните по функции и прочитайте)
Код:
ConsoleWrite()
 
Автор
K

KEO

Новичок
Сообщения
26
Репутация
0
Да, вот так (без consoleWrite) получилось :smile: Закладка неактивна, а Handle нашел тот что нужно. Спасибо.

Вот еще одна проблемка возникла. :smile:

Код:
Opt("WinTitleMatchMode", 2)
$Klondayk_Handle = ControlGetHandle("Mozilla Firefox", "", "GeckoFPSandboxChildWindow1")

$Klondayk_Position = WinGetPos ($Klondayk_Handle)  ;Берем координаты окна Клондайка

MsgBox($MB_SYSTEMMODAL, "", "X = " & $Klondayk_Position[0] & @CR & "Y = " & $Klondayk_Position[1] & @CR & "Width = " & $Klondayk_Position[2] & @CR & "Height = " & $Klondayk_Position[3])


Параметры Width и Height окна клондайка выдаёт одни и те же всегда. Это гуд. А вот с координатами левого верхнего положения - проблема.
Если закладка с Клондайком активна - выдаёт правильные координаты положения окна.
Если закладка с Клондайком неактивна (активна другая закладка) - выдаёт лажу. Вплоть до того, что выдаёт: X = -32000, Y = -32000.

Подскажите плиз: что еще нужно крутнуть, чтобы координаты всегда были правильными ? :smile:
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
KEO
То, что вы называете "дочерним окном", в рамках AutoIt является элементом (контролом). Поэтому лучше к нему применять функции, начинающиеся на Control*
Код:
ControlGetHandle()
ControlGetPos()
ControlClick()
ControlSend()
; и т.д.
А функции Win* лучше применять к окну Firefox.
 
Автор
K

KEO

Новичок
Сообщения
26
Репутация
0
Вместо WinGetPos использовал как вы порекомендовали ControlGetPos.

Код:
$Klondayk_Position = ControlGetPos ("Mozilla Firefox", "", "GeckoFPSandboxChildWindow1")  ;Берем координаты окна Клондайка


Но ситуация не изменилась. При активости закладки Клондайка - координаты верные. При неактивности - X=0, Y=0.
Поставил (на всякий случай)
Код:
Opt("WinSearchChildren", 1)


не помогло.

Помогите пожалуйста решить этот вопрос.

И потом у меня еще будет третий вопрос, когда решим этот второй. Тоже пытаюсь разобраться - не получается, хотя многое просмотрел в справке. Но это потом, сперва с этим надо разобраться.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
KEO [?]
Вот еще одна проблемка возникла
[?]
у меня еще будет третий вопрос
Предупреждение За нарушение общих правил (пункт В.4):
Не лепите несколько вопросов разной тематики в один пост. По типу "Ребят, а ещё такой вопрос...". Каждый вопрос в свою тему.


С уважением, ваш Глобальный модератор.
 
Автор
K

KEO

Новичок
Сообщения
26
Репутация
0
Для модератор:

Третий вопрос будет не "разной тематики". Он как раз будет продолжением общего вопроса именно этой темы. Я могу создать потом отдельную тему, но в любом случае она будет ссылаться на эту. А смысл ? Просто чтобы не нагружать сразу много вопросов и не переключать с одного не решенного вопроса на другой внимание тех, кто мне может помочь во втором вопросе моей общей проблемы - третий вопрос пока не задаю. Просто заранее даю знать форумчанам, что проблема окончательно не решена и будет еще и третий вопрос, чтобы далеко не уходили от монитора. :smile: Только и всего.

Хорошо, с позволения модераторов я задам сразу и третий вопрос.

Вообще, суть моей проблемы такова: я создал 5 различных скриптов (2 бота, 3 скрипта) для игры клондайк. И каждый раз запускаю их из Проводника. Хочу сделать GUI-панель с 5-ю кнопками быстрого вызова этих скриптов. GUI-панель с кнопками я создал и сформировал как мне надо. Теперь нужно, чтобы эта панель создавалась именно в окне Клондайка, а не отдельно. И не просто там создавалась, а в нужных мне координатах.

Вот именно поэтому мне и понадобилось найти Handle Клондайка. Именно поэтому я сейчас ищу способ сделать так, чтобы координаты все время определялись правильно, а не только когда Закладка активна.

И осталось также решить третью проблему - чтобы создаваемая мною GUI-панель принадлежала исключительно(!) рабочей области Клондайка.
Создаю так:

Код:
Global $MyWindowGUI = GUICreate ("", $MyGuiWindowWidth, $MyGuiWindowHeight, $Klondayk_Position[0], $Klondayk_Position[1], 0x80800000, "", $Klondayk_Handle)


Значение 0x80800000 - это ($WS_POPUP + $WS_BORDER). Последним параметром назначаю как раз таки найденный Handle окна Клондайка.

GUI-панель при создании создаётся в окне Клондайка. При переключении на другое приложение (например Проводник) - панель уже не видна на экране (это гуд). Но когда я в самом FireFox'е переключаю закладку с Клондайка на другую, то GUI-панель по прежнему остаётся видна на экране. $WS_EX_TOPMOST не включён !

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

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
KEO,
Раз Вы не понимаете(игнорируете) предупреждение, то тема закрыта.
 
Статус
Закрыто для дальнейших ответов.
Верх