1 место Zennoposter + WinAPI (для чайников). Автоматизация любого десктоп приложения

WalkODoff

Client
Регистрация
09.04.2016
Сообщения
155
Благодарностей
33
Баллы
28

seodamage

Client
Регистрация
08.09.2014
Сообщения
227
Благодарностей
69
Баллы
28

NikiSara

Новичок
Регистрация
26.03.2023
Сообщения
4
Благодарностей
0
Баллы
1
Доброе время суток, форумчане. Итак приступим. Многие из нас помнят статью от моего товарища 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



Меняем Mac Adress
Для смены будем юзать Technitium MAC Address Changer. Ссылка тут https://technitium.com/tmac/
Алгоритм очень интересен.
1) Находим хендл окна. Technitium MAC Address Changer v6 - by Shreyas Zare
2) Находим хендл контрола, который отображает список сетевых интерфейсов. Я знаю что это элемент ListView и для работы с ней есть спец. метод. (PS можно в принципе сделать клик по координатам, если не хотите парится). Так вот. Сперва надо посчитать сколько элементов в списке.
Я делаю это с помощью след. кода. В отладчике вижу цифру 2 - все четко
C#:
var count = AutoItX.ControlListView(handle, listview, "GetItemCount", "", "");
Описание метода ControlListView https://autoit-script.ru/autoit3_docs/functions/ControlListView.htm
3) Далее выделяем второй элемент в списке. Первый у меня от виртуалки кажись.
C#:
 AutoItX.ControlListView(handle, listview, "Select", "0", "1");
4) Тут уже все попроще. Находим хендлы двух кнопок - сперва рандомизация мака, а потом применение изменений.
5) На гифке показано как все работает. На доли секунд можете увидеть скайп который потерял сигнал из-за смены мака.

Полный код.
C#:
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);





Viber
Тут мы сталкиваемся с некоторыми траблами. Так как прога написана на QT в силу некоторых ньансов Autoit Info нам не покажет кроме хендла главного окна ничего. Ну ниче. Будем работать с координатами.

1) Получаем хендл окна по заголовку (Title)
2) Нам надо форму привязать к верхней левой части окна
3) Кликаем по 4 кнопке сверху
Посмотреть вложение 17468
4) Кликаем по полю ввода для его активации
5) Вводим номер телефона

C#:
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");
Друзья, коллеги, форумчане. Каждый ваш голос это мотивация для написания таких же интересных статей) Я старался для вас)
Супер! Спасибо большое!
 

Redsmokky

Client
Регистрация
06.10.2015
Сообщения
314
Благодарностей
196
Баллы
43
Разобрался с флагами, работает отлично
Код:
var handle = AutoItX.WinGetHandle("Video Editor");
AutoItX.WinSetState(handle, AutoItX.SW_HIDE);
Флаг отображения окна:
AutoItX.SW_HIDE = Скрыть
AutoItX.SW_SHOW = Показать ранее скрытое окно
AutoItX.SW_MINIMIZE = Свернуть
AutoItX.SW_MAXIMIZE = Развернуть
AutoItX.SW_RESTORE = Восстановить свёрнутое или развёрнутое окно
AutoItX.SW_DISABLE = Запретить доступ
AutoItX.SW_ENABLE = Разрешить доступ
Куда это прописать?
 

semen26

Client
Регистрация
30.09.2016
Сообщения
43
Благодарностей
27
Баллы
18
Заметил такой момент если в PM в настройках инстанса поставить Cromium(beta), то AutoIt даже мышкой двигать не хочет ZP 7.7.12
кто с таким сталкивался?
 

Кто просматривает тему: (Всего: 4, Пользователи: 0, Гости: 4)