Доброе время суток, форумчане. Итак приступим. Многие из нас помнят статью от моего товарища
Serkser http://zennolab.com/discussion/threads/pm-winapi-ili-upravlenie-oknami-ljubyx-drugix-prilozhenij.27491/. Статья отличная, да правда порог вхождения ну очень высок. Я думаю 90 процентов юзеров прочитались, восхитились и все - дальше этого дело не пошло. Даже для меня это было сложновато на первых порах.
Сегодня я покажу вам как не обладая большими знаниями в кодинге автоматизировать работу в
любом приложении. Использовать мы будем обертку над
autoit. Они прикреплены к проекту.
Для того чтобы работать с окном программы нам нужно понять пару определений
Window - окно приложения
Control - элемент управления (button, label и т.д)
Т.е. по сути есть главное окно и на нам разбросано множество контролов. Для подробного объяснения откроем
калькулятор.
Есть главное окно
(выделено красным) и есть контролы (
выделено синим). По сути контролы это button-простые кнопки.
Посмотреть вложение 17458
Получается древовидная структура.
Это самый простой случай. Бывает что у каждого контрола есть свои контролы. Идем дальше.
У каждого окна (Window) есть ряд параметров (рассмотрим основные).
Посмотреть вложение 17459
Title - Заголовок (у меня англ. версия Windows - у вас скорей всего будет просто Калькулятор)
Class - Базовый класс окна
Position - Текущая позиция окна в системе.
Size - Размер окна
Handle - Дескриптор окна.
Я думаю у всех возник вопрос - что за дескриптор такой. Не буду грузить ссылками из msdn.
Дескриптор (дословно - описатель) - код, определяющий какой-то ресурс в системе. Грубо говоря - номер окна в системе.
Handle, HNDL, Дескриптор - это одно и тоже.
У каждого
контрола также есть список параметров.
Посмотреть вложение 17460
Class - Класс контрола
Instance - порядковый номер экземпляра контрола.
Advanced Mode - Расширений вид
Position - Текущая позиция окна в системе.
Size - Размер окна
Handle - Дескриптор контрола.
Наверное у каждого возник вопрос - что за прога такая, которая показывает информацию об окне. Это прога
Au3Info, которая идет в пакете с autoit.
https://www.autoitscript.com/site/autoit/downloads/
Часть вторая. Теория практики.
Работа с autoit будет вестись с помощью специальной библиотеки - обертки для нее на c#.
В данной библиотеке реализовано почти 80 методов. Некоторые из них думаю нет смысл использовать так как уже реализовано в зеннке.
Дабы вы поняли насколько легко работать с данной библиотекой я покажу просто метод клика по координатам x,y.
MouseClick
Выполнение клика мышью.
Параметры
Button | Типы значений:
“right” – правая кнопка мыши
“middle” –средняя кнопка мыши
“left” – левая кнопка мыши |
x, y | [необязательный] Координаты x и y указывают на точку для клика. Если они не указаны, то клик идет в текущем расположении мыши. |
clicks | [необязательный] Количество кликов. По умолчанию 1. |
speed | необязательный] Скорость перемещения мыши в диапазоне от 1(быстро) до 100(медленно). Если значение скорости равно 0, то мышь перемещается мгновенно. Скорость по умолчанию равна 10. |
[TBODY] [/TBODY]
Пример использования
Посмотреть вложение 17461
Данный метод работает без дескриптора окна, да в принципе даже и без координат. Единственный обязательный параметр это какую кнопки мыши нам нужно нажимать. Если мы не укажем координаты, то он кликнет по текущем расположению указателя мыши.
Чтобы работать с элементами формы да и с самой формой нам нужно узнать дескриптор (Handle) окна.
WinGetHandle
Выполнение клика мышью.
Параметры
Заголовок/дескриптор/класс окна
[необязательный] Текст окна
title | Заголовок/дескриптор/класс окна. |
text | [необязательный] Текст окна. |
[TBODY] [/TBODY]
Смотрим параметры окна. Мы можем получить дескриптор окна по
Title(заголовку окна).
Посмотреть вложение 17462
Запускаем код. Видим шесть цифр - это и есть наш хендл(дескриптор).
921668 это предстваление в десятеричной системе счисления - в 16-ой это число
E1044. Как мы результат совпадает с тем что мы видим выше. (0x00000000000E1044)
Посмотреть вложение 17463
Теперь попробуем нажать любую кнопку. Допустим цифру
5. Но сперва нам надо получить хендл(дескриптор) контрола а затем уже кликать. За это отвечают два метода
ControlGetHandle и
ControlClick. В принципе из названия понятно что они делают.
ControlGetHandle
Возвращает внутренний указатель элемента.
title | Заголовок/дескриптор/класс окна. |
text | Текст окна. |
controlID | Идентификатор элемента управления |
[TBODY] [/TBODY]
ControlClick
Эмулирует нажатие мыши на указанный элемент интерфейса.
title | Заголовок/дескриптор/класс окна |
text | Текст окна |
controlId | Идентификатор элемента управления |
button | [необязательный] Кнопка мыши, которой эмулировать нажатие: "left", "right", "middle", "main", "menu", "primary", "secondary". По умолчанию левая кнопка. |
clicks | [необязательный] Количество кликов мыши. По умолчанию 1. |
x | [необязательный] Координата X для клика внутри элемента, относительно левого верхнего угла элемента. По умолчанию в центре. |
y | [необязательный] Координата Y для клика внутри элемента, относительно левого верхнего угла элемента. По умолчанию в центре. |
[TBODY] [/TBODY]
Теперь смотрим по каким параметрам можем найти контрол.
Посмотреть вложение 17466
Видим
ClassnameNN и
Advanced Mode. Вот по ним и будем искать.
Посмотреть вложение 17464
Вот еще один вариант. Результат один и тот же.
Посмотреть вложение 17465
Часть третья. Практика.
Думаю хватит нам калькуляторов и всяких хеллоу-вордов. В ранних статьях я описывал работу в скайпе
http://zennolab.com/discussion/threads/zennoposter-i-skype-desktop-versija.23980/. Однако у нее есть масса ограничений, которые мы щас попробуем обойти.
Алгоритм работы во всех случаях один.
1) Запускам
Au3Info (Autoit Window Info)
2) Находим хендл(дескриптор) главного окна
3) Находим хендл контролла
4) В бой!
1) Handle главного окна я нахожу по заголовку (Title) моего окна скайп.
2) Handle элемента для поиска мы берем по
Advanced Mode [CLASS:TSearchControl; INSTANCE:1]
3) Тут
важный момент. Прежде чем набирать текст нужно сделать
активным окно скайпа. В случае с калькулятором оно не нужно было, а тут необходимо. Используем
WinActivate (
https://autoit-script.ru/autoit3_docs/functions/WinActivate.htm)
4) Кликаем с помощью метода
Send (описание тут
https://autoit-script.ru/autoit3_docs/functions/Send.htm )
var handle = AutoItX.WinGetHandle("Skype™ - ahvahsky2008");
var editbox = AutoItX.ControlGetHandle(handle, "[CLASS:TSearchControl; INSTANCE:1]");
AutoItX.WinActivate(handle);
AutoItX.Send("test", 1);
иии.. Вуаля!
Посмотреть вложение 17467
Для смены будем юзать Technitium MAC Address Changer. Ссылка тут
https://technitium.com/tmac/
Алгоритм очень интересен.
1) Находим хендл окна.
Technitium MAC Address Changer v6 - by Shreyas Zare
2) Находим хендл контрола, который отображает список сетевых интерфейсов. Я знаю что это элемент
ListView и для работы с ней есть спец. метод. (PS можно в принципе сделать клик по координатам, если не хотите парится). Так вот. Сперва надо посчитать сколько элементов в списке.
Я делаю это с помощью след. кода. В отладчике вижу цифру 2 - все четко
var count = AutoItX.ControlListView(handle, listview, "GetItemCount", "", "");
Описание метода
ControlListView https://autoit-script.ru/autoit3_docs/functions/ControlListView.htm
3) Далее выделяем второй элемент в списке. Первый у меня от виртуалки кажись.
AutoItX.ControlListView(handle, listview, "Select", "0", "1");
4) Тут уже все попроще. Находим хендлы двух кнопок - сперва рандомизация мака, а потом применение изменений.
5) На гифке показано как все работает. На доли секунд можете увидеть скайп который потерял сигнал из-за смены мака.
Полный код.
var handle = AutoItX.WinGetHandle("Technitium MAC Address Changer v6 - by Shreyas Zare");
var listview = AutoItX.ControlGetHandle(handle, "[CLASS:ListView20WndClass; INSTANCE:10]");
AutoItX.WinActivate(handle);
var count = AutoItX.ControlListView(handle, listview, "GetItemCount", "", "");
AutoItX.ControlListView(handle, listview, "Select", "0", "1");
var randomBtn = AutoItX.ControlGetHandle(handle, "ThunderRT6CommandButton7");
AutoItX.ControlClick(handle, randomBtn);
var changeBtn = AutoItX.ControlGetHandle(handle, "ThunderRT6CommandButton6");
AutoItX.ControlClick(handle, changeBtn);
Тут мы сталкиваемся с некоторыми траблами. Так как прога написана на QT в силу некоторых
ньансов Autoit Info нам не покажет кроме хендла главного окна ничего. Ну ниче. Будем работать с координатами.
1) Получаем хендл окна по заголовку (Title)
2) Нам надо форму привязать к верхней левой части окна
3) Кликаем по 4 кнопке сверху
Посмотреть вложение 17468
4) Кликаем по полю ввода для его активации
5) Вводим номер телефона
var handle = AutoItX.WinGetHandle("Viber +79285533129");
AutoItX.WinActivate(handle);
AutoItX.WinMove(handle, 0, 0);
AutoItX.MouseClick("LEFT", 278, 102);
AutoItX.MouseClick("LEFT", 136, 183);
AutoItX.Send("79285533129");
Друзья, коллеги, форумчане. Каждый ваш голос это мотивация для написания таких же интересных статей) Я старался для вас)