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

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 498
Благодарностей
1 246
Баллы
113
Доброе время суток, форумчане. Итак приступим. Многие из нас помнят статью от моего товарища Serkser http://zennolab.com/discussion/threads/pm-winapi-ili-upravlenie-oknami-ljubyx-drugix-prilozhenij.27491/. Статья отличная, да правда порог вхождения ну очень высок. Я думаю 90 процентов юзеров прочитались, восхитились и все - дальше этого дело не пошло. Даже для меня это было сложновато на первых порах.

Сегодня я покажу вам как не обладая большими знаниями в кодинге автоматизировать работу в любом приложении. Использовать мы будем обертку над autoit. Они прикреплены к проекту.



Часть первая. Теория

Для того чтобы работать с окном программы нам нужно понять пару определений

Window - окно приложения
Control - элемент управления (button, label и т.д)

Т.е. по сути есть главное окно и на нам разбросано множество контролов. Для подробного объяснения откроем калькулятор.
Есть главное окно (выделено красным) и есть контролы (выделено синим). По сути контролы это button-простые кнопки.
Untitled - Paint.jpg
Получается древовидная структура.
Это самый простой случай. Бывает что у каждого контрола есть свои контролы. Идем дальше.

У каждого окна (Window) есть ряд параметров (рассмотрим основные).
Untitled.png
Title - Заголовок (у меня англ. версия Windows - у вас скорей всего будет просто Калькулятор)
Class - Базовый класс окна
Position - Текущая позиция окна в системе.
Size - Размер окна
Handle - Дескриптор окна.

Я думаю у всех возник вопрос - что за дескриптор такой. Не буду грузить ссылками из msdn. Дескриптор (дословно - описатель) - код, определяющий какой-то ресурс в системе. Грубо говоря - номер окна в системе. Handle, HNDL, Дескриптор - это одно и тоже.

У каждого контрола также есть список параметров.

Untitled.png

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]
Пример использования
Untitled.png

Данный метод работает без дескриптора окна, да в принципе даже и без координат. Единственный обязательный параметр это какую кнопки мыши нам нужно нажимать. Если мы не укажем координаты, то он кликнет по текущем расположению указателя мыши.

Чтобы работать с элементами формы да и с самой формой нам нужно узнать дескриптор (Handle) окна.

WinGetHandle
Выполнение клика мышью.
Параметры
Заголовок/дескриптор/класс окна[необязательный] Текст окна
title Заголовок/дескриптор/класс окна.
text[необязательный] Текст окна.
[TBODY] [/TBODY]
Смотрим параметры окна. Мы можем получить дескриптор окна по Title(заголовку окна).

Untitled.png


Запускаем код. Видим шесть цифр - это и есть наш хендл(дескриптор). 921668 это предстваление в десятеричной системе счисления - в 16-ой это число E1044. Как мы результат совпадает с тем что мы видим выше. (0x00000000000E1044)
upload_2016-12-20_9-45-39.png


Теперь попробуем нажать любую кнопку. Допустим цифру 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]
Теперь смотрим по каким параметрам можем найти контрол.

upload_2016-12-20_10-32-59.png


Видим ClassnameNN и Advanced Mode. Вот по ним и будем искать.



upload_2016-12-20_10-15-15.png


Вот еще один вариант. Результат один и тот же.
upload_2016-12-20_10-31-11.png


Часть третья. Практика.

Думаю хватит нам калькуляторов и всяких хеллоу-вордов. В ранних статьях я описывал работу в скайпе 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);
иии.. Вуаля!

111232222223.gif




Меняем 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 кнопке сверху
upload_2016-12-20_11-53-11.png

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

Вложения

Для запуска проектов требуется программа ZennoPoster или ZennoDroid.
Это основное приложение, предназначенное для выполнения автоматизированных шаблонов действий (ботов).
Подробнее...

Для того чтобы запустить шаблон, откройте нужную программу. Нажмите кнопку «Добавить», и выберите файл проекта, который хотите запустить.
Подробнее о том, где и как выполняется проект.

Последнее редактирование:

Sanekk

Client
Регистрация
24.06.2016
Сообщения
988
Благодарностей
389
Баллы
63
Улетная тема,и в правду намного проще в освоении чем у Serkser,
Radzhab спасибо за новое решение,буду копать)))
 
Последнее редактирование модератором:
  • Спасибо
Реакции: AlisaZ

stanar

Client
Регистрация
19.12.2015
Сообщения
312
Благодарностей
155
Баллы
43
Мотивированный трафик)
 
  • Спасибо
Реакции: AlisaZ и Radzhab

Chick80

Client
Регистрация
04.12.2014
Сообщения
298
Благодарностей
82
Баллы
28
Какая версия AutoIT?
Я его, было, похоронил вместе с ХР... А тут гляди-ка, живее всех живых...
 
  • Спасибо
Реакции: AlisaZ

VerBin

Client
Регистрация
28.05.2016
Сообщения
555
Благодарностей
442
Баллы
63
Материал без сомнений интересен с технической стороны.
Еще одна практическая статья по вариантам автоматизации не будет лишней.
 
Последнее редактирование модератором:
Регистрация
08.07.2015
Сообщения
2 851
Благодарностей
712
Баллы
113
Улетная тема,и в правду намного проще в освоении чем у Serkser,
Radzhab спасибо за новое решение,буду копать)))

это предложение прям подкупает проголосавать)))
ага но для меня подмена времени на локальном ПК на 1 месте это 300% дальше думать буду )
 
  • Спасибо
Реакции: AlisaZ

Chick80

Client
Регистрация
04.12.2014
Сообщения
298
Благодарностей
82
Баллы
28
  • Спасибо
Реакции: Radzhab

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 498
Благодарностей
1 246
Баллы
113
Регистрация
08.07.2015
Сообщения
2 851
Благодарностей
712
Баллы
113
Уверен? :-)
Если изменишь время в системе, Зенка работать откажется ;-)
такто VerBin в 6 конкурсе выложил отличное решение которое 100% на 1 место идет!

http://zennolab.com/discussion/threads/podmena-sistemnogo-vremeni-v-zennoposter.33696/

прости меня Radzhab но та тема более актульна для меня, решение про палево на 1 месте!
Так у него подмена - но не изменение.
это не важно главное решение делает свое дело и сайт не палит меня, что я за проксей сижу и зенка не бубнит!
 

VerBin

Client
Регистрация
28.05.2016
Сообщения
555
Благодарностей
442
Баллы
63
такто VerBin в 6 конкурсе выложил отличное решение которое 100% на 1 место идет!

http://zennolab.com/discussion/threads/podmena-sistemnogo-vremeni-v-zennoposter.33696/
Благодарю за позитивную оценку, все-же прошу воздержатся от рекламы =)
Все решения интересны.
Каждый пользователь выберет то, что ему будет полезно.
Спасибо.
 
  • Спасибо
Реакции: DenisK и AlisaZ

Chick80

Client
Регистрация
04.12.2014
Сообщения
298
Благодарностей
82
Баллы
28
Так у него подмена - но не изменение.
ага но для меня подмена времени на локальном ПК на 1 месте это 300% дальше думать буду )
сорь, затупил ))) Подумал, что МастерЛомастер решил с помощью AutoIT время в системе менять :-)
 
  • Спасибо
Реакции: Radzhab
Регистрация
08.07.2015
Сообщения
2 851
Благодарностей
712
Баллы
113
Благодарю за позитивную оценку, все-же прошу воздержатся от рекламы =)
Все решения интересны.
Каждый пользователь выберет то, что ему будет полезно.
Спасибо.
я не рекламирую ) я обсуждаю и высказываю свои мысли!
 

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 498
Благодарностей
1 246
Баллы
113
  • Спасибо
Реакции: masterLomaster

nvmds

Client
Регистрация
04.05.2016
Сообщения
86
Благодарностей
7
Баллы
8
Спасибо за статью. А таким способом можно дожидаться появления какого-то элемента?
 

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 498
Благодарностей
1 246
Баллы
113
Можно сделать так. В цикле смотреть нет ли нового элемента.
for (...)
{
if (AutoItX.WinGetHandleAsText()!="")
{
// Если элемент появился - то работаем с ним.
}
}
 

AloneSlamer

Client
Регистрация
29.01.2013
Сообщения
1 405
Благодарностей
361
Баллы
83

Обращаем Ваше внимание на то, что данный пользователь заблокирован.
Не рекомендуем проводить с AloneSlamer какие-либо сделки.

А как сделать спамер если я хочу постить в приложении которое разворачивается на весь экран?
 

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 498
Благодарностей
1 246
Баллы
113
Какая версия AutoIT?
Я его, было, похоронил вместе с ХР... А тут гляди-ка, живее всех живых...
Версию врядли скажу. Насчет актуальности - сообщество автоитеров очень активно развивается.
 

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 695
Благодарностей
3 952
Баллы
113
С AutoIt у меня есть один опыт. Когда-то очень давно сделал коммерческую прогу для создания коллажей открыток, а сохранение в картинку никак не получалось. Нагуглил АвтоИт, сделал скрипт, ну и запустил прогу в продакшен, деньги потратил на раскрутку, а толку почти нет. Оказалось, что пара популярных антивирусов определяла прогу как имеющую вирусы и именно экзешник созданного AutoIt скрипта давал такой результат.
 
  • Спасибо
Реакции: AlisaZ

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 022
Баллы
113
Неужели никто не начал тестить?)
Вот если бы данное решение "не отбирало мышку", то однозначно цены бы не было, а так есть разного рода автокликеры.
Но всё же, так как в данном случае обходимся без лишнего софта + статья написана очень хорошо - приятно читать - Спасибо и лайк!
 
  • Спасибо
Реакции: Radzhab и proffman

proffman

Client
Регистрация
24.01.2013
Сообщения
548
Благодарностей
51
Баллы
28
Отбирает мышь только если кликать по координатам. Если кликать по контролам проблем нет
На передний план окно программы выводит, но лучше чем отбирание мышки:az:
 
Последнее редактирование:

EccoArts

Client
Регистрация
07.04.2016
Сообщения
23
Благодарностей
9
Баллы
3
У меня с AutoIT всё и начиналось, первый боты для игр таких как WoW :-)
Был сделан скрипт по сбору ресурсов.
 
  • Спасибо
Реакции: Radzhab

Mr-Grey

Client
Регистрация
03.02.2016
Сообщения
88
Благодарностей
6
Баллы
8
Офигенная вещь. Спасибо!
 
  • Спасибо
Реакции: Radzhab

GoldenEagle

Новичок
Регистрация
16.04.2016
Сообщения
24
Благодарностей
3
Баллы
3
Отбирает мышь только если кликать по координатам. Если кликать по контролам проблем нет
а если это андройд эмулятор как то получить значения из него можно?
 

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