Что нового

Особенности функций Control (управление элементами окна)

A

Alofa

Гость
Прошу знающих людей наставить меня на путь истинный.

Тут недавно обнаружил что функция ...
Код:
ControlGetHandle($hWnd, "", "")
... в таком виде возвращает дескриптор элемента, который является по умолчанию для данного окна. :shok:

Что это - баг, закономерность или недокументированная особенность?
А может быть это я где-то что-то упустил?



Опытным путем добился подтверждения слов InnI (смотри пост ниже),
о том что:
InnI сказал(а):
В Win* и Control* функциях при использовании пустых параметров в качестве Title и ControlID работа будет проводиться с активным окном или элементом...
Не поленился и поэкспериментировал с каждой функцией раздела справки Функции --> Окна --> Управление элементами, кроме
Код:
ControlFocus, ControlGetFocus, StatusbarGetText
на предмет их работоспособности без назначения параметров "title", "text" и "controlID".
Что касается отсутствия ("") первых двух, то тут функции работают, согласно справочным данным:
Примечание: пустая строка "", переданная в качестве заголовка и текста означает, что будет использовано текущее активное окно..!
Только хотел бы добавить, что если нет вообще ни одного активного окна, то будет использован дескриптор рабочего стола.
Window
======
Title: Program Manager
Class: Progman

Control
=======
Class: SysListView32
Instance: 1
ID: 1
Text: FolderView

При пустом параметре "controlID" функции отрабатывают все также, как и писал InnI:
InnI сказал(а):
... В случае с элементом, "активным" считается элемент, имеющий фокус ввода
Тут я попытался поиграть флагами состояний окон элементов и пришел к выводу, что при любых флагах (кроме "@SW_MINIMIZE") функции отрабатывают хорошо.
Ну а при "@SW_MINIMIZE" поймать элемент в фокусе для функций становиться невозможным. Несмотря на это они возвращают следующие значения:
Код:
ControlClick	; -->  возвращает 1 (Успех)
ControlCommand	; --> устанавливает @error = 1 (Ошибка)
ControlDisable	; --> возвращает 1 (Успех)
ControlEnable	; --> возвращает 1 (Успех)
ControlGetHandle; --> возвращает дескриптор Окна
ControlGetPos	; --> возвращает размер Окна
ControlGetText	; --> возвращает заголовок Окна
ControlHide		; --> возвращает 1 (Успех)
ControlListView	; --> устанавливает @error = 0 (Успех)
ControlMove		; --> возвращает 1 (Успех)
ControlSend		; --> возвращает 1 (Успех)
ControlSetText	; --> возвращает 1 (Успех)
ControlShow		; --> возвращает 1 (Успех)
ControlTreeView	; --> возвращает 1 (Успех)

В дополнении хотелось бы добавить, что функция
Код:
ControlGetHandle
в случае если никакое окно не соответствует заданным критериям, возвращает не пустую строку, а "0x00000000".


P.s: И да простят меня модераторы за изменение названия темы.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Re: Функция ControlGetHandle - интересная особенность

Alofa
В Win* и Control* функциях при использовании пустых параметров в качестве Title и ControlID работа будет проводиться с активным окном или элементом. В случае окна - здесь, надеюсь, всё понятно. В случае с элементом, "активным" считается элемент, имеющий фокус ввода
Код:
ControlGetFocus()
Если окно не активно, то оно не может принимать ввод с клавиатуры или мыши, и у него не будет "активного" элемента. Такая же "проблема" и в случае, если у окна нет элементов, способных воспринимать ввод (картинки, тексты и т.п.). В этом случае возвращается дескриптор самого окна.

Вот пример для блокнота - сравните вывод при активном и неактивно окне
Код:
ConsoleWrite("Окно: " & WinGetHandle("[class:Notepad]") & @CRLF)
ConsoleWrite("Элемент: " & ControlGetHandle("[class:Notepad]", "", "") & @CRLF)
ConsoleWrite("Фокус ввода: " & ControlGetFocus("[class:Notepad]") & @CRLF)

WinActivate("[class:Notepad]")
ConsoleWrite("Окно: " & WinGetHandle("") & @CRLF)
ConsoleWrite("Элемент: " & ControlGetHandle("", "", "") & @CRLF)
ConsoleWrite("Фокус ввода: " & ControlGetFocus("") & @CRLF)
 
Автор
A

Alofa

Гость
Re: Функция ControlGetHandle - интересная особенность

InnI спасибо за объяснение.

InnI сказал(а):
Alofa
В Win* и Control* функциях при использовании пустых параметров в качестве Title и ControlID работа будет проводиться с активным окном или элементом...
Вы это подчерпнули из собственного опыта или прочитали где?
Меня больше беспокоит где я что упустил, для того чтобы почитать (а может чего еще упустил)?
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Верх