Отправляет email-рассылки с помощью сервиса Sendsay

[TC] controlId/handle для button - практическое применение

Здравствуйте, господа подписчики.

Сколько раз не читал мануал по написанию скриптов, не могу понять
практическое применение некоторых элементов технической информации окна, а
именно, что делать с handle окна.

К примеру, есть программа. Представим, что в неком диалоговом окне у неё две
кнопки: "да" и "нет". По ins+ctrl+f1 я получаю техническую информацию для
обоих:

"да"
Control ID 1198
Class Button
Handle 15337368

"нет"
Control ID 1198
Class Button
Handle 16516868

Задача такая: скрипт ищет кнопку "нет" и нажимает её через LeftMouseButton
() или любым другим удобным способом. Если бы Control ID у неё был другой,
тогда можно было бы найти окно именно с этим ID и далее натравить на него
LeftMouseButton, т. е. я бы точно знал, что Control ID 1198 - Это кнопка
"нет", а 1192 - кнопка "да". А как быть в ситуации, когда ID у всех, или
хотя бы двух окон, одинаковый? Я так понимаю, что для этого каким-то образом
можно воспользоваться handle окна? В учебнике по скриптописанию так и
написано: "Используйте ручку окна, чтобы идентифицировать его среди других
окон в системе в данное конкретное время". Каким же образом
"идентифицировать" окно, если handle заранее неизвестен? Известно только
значение Control ID, а оно одинаково для обоих окон.. Даже если я соберу ID
и Handle у всех окон, то что мне делать с полученой информацией? Как
применить её на практике?

Поясните, пожалуйста, новичку. Если можно, с примером.

Ответить   Игорь Лялин Wed, 22 Jul 2009 07:41:52 +0400 (#886796)

 

Ответы:

привет Игорь!
ц
а именно, что делать с handle окна.
немного о хандлах и идах.
handle - уникальный идентификатор, который присваевает вигнда любому возникшему
в ней окну.
в данный момент это будет одно число,
при следующем запуске программы - другое.

Control Id - уникальный номер окна в приложении который раз и навсегда присваевает
програмист при создании программы.
точнее хотелось бы чтобы присваивал, но...
существуют "правильные" приложения, в которых у окон статические и уникальные
для конкретного приложения Id и
"не правильные" в которых они:
нулевые, отрицательные, равные Handle.

ц
"да" Control ID 1198
"нет" Control ID 1198
Если бы Control ID у неё был другой,
если не возможно получить ручку по контрол иду, тогда есть несколько способов.
вот 2 из них:
первый это функция с тремя параметрами
FindWindow (

starting window,

class name to search for,
the name of the window to find)
думаю переводить излишне.
но и сочетания класса и имени бывает в программе не уникальным,
тогда
второй способ, который зачастую только и остаётся,
это как говорил Архимед
"Дайте мне точку опоры..."
мир мы переворачивать не будем,
но например в дереве окон программы есть нормальное окно с статическим Id или
уникальным сочетанием класса и имени,
и у него например третьим дочерним окном наша кнопка "нет"
находим его функцией
FindWindow

или привычной вам

FindDescendantWindow по Id

затем при помощи функций

GetChild

и
GetNextWindow
получаем ручку интересующего нас окна
запоминаем текущий курсор
SaveCursor ()
скармливаем ручку функции перемещения JAWS курсора.
MoveToWindow
вот собственно зачем нужны ручки, а не затем чтобы искать окно.
функция активирует JAWS курсор,
и перемещает указатель мыши к нужной кнопке
далее восстанавливаем pc курсор
Restore ()
и наконец
левый клик
вот 2 наиболее простых способа поиска нужного нам окна.

ц
А как быть в ситуации, когда ID у всех, или
хотя бы двух окон, одинаковый? Я так понимаю, что для этого каким-то образом
можно воспользоваться handle окна?
я думаю что из выше написаного вы уже поняли что ручкой окна для его поиска воспользоваться
нельзя.
так как при каждом возникновении этого окна на вашем компе винда присваевает
ему заранее вам не известный номер, он же Handle.
а нам нужны параметры которые не изменны,
то как:
Id а если его нет то класс и имя искомого окна или хотябы окна, относительно
которого или которых искомое окно остаётся расположеным постояно.
надеюсь смог объяснить понятно.
Виктор

Ответить   Wed, 22 Jul 2009 10:41:15 +0400 (#886893)

 

и если монжно,в лист.
Алекс.

Ответить   Thu, 23 Jul 2009 05:19:39 +0400 (#887145)