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

Discussion in 'Шестой конкурс статей' started by Radzhab, Dec 20, 2016.

  1. Radzhab

    Radzhab Client

    Joined:
    May 23, 2014
    Messages:
    1,362
    Likes Received:
    1,040
    Доброе время суток, форумчане. Итак приступим. Многие из нас помнят статью от моего товарища Serkser http://zennolab.com/discussion/thre...lenie-oknami-ljubyx-drugix-prilozhenij.27491/. Статья отличная, да правда порог вхождения ну очень высок. Я думаю 90 процентов юзеров прочитались, восхитились и все - дальше этого дело не пошло. Даже для меня это было сложновато на первых порах.

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

    [​IMG]

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

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

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

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

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

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

    Untitled.png

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

    Теперь попробуем нажать любую кнопку. Допустим цифру 5. Но сперва нам надо получить хендл(дескриптор) контрола а затем уже кликать. За это отвечают два метода ControlGetHandle и ControlClick. В принципе из названия понятно что они делают.

    ControlGetHandle
    Возвращает внутренний указатель элемента.​
    titleЗаголовок/дескриптор/класс окна.
    textТекст окна.
    controlIDИдентификатор элемента управления
    ControlClick
    Эмулирует нажатие мыши на указанный элемент интерфейса.​
    titleЗаголовок/дескриптор/класс окна
    textТекст окна
    controlIdИдентификатор элемента управления
    button[необязательный] Кнопка мыши, которой эмулировать нажатие: "left", "right", "middle", "main", "menu", "primary", "secondary". По умолчанию левая кнопка.
    clicks[необязательный] Количество кликов мыши. По умолчанию 1.
    x[необязательный] Координата X для клика внутри элемента, относительно левого верхнего угла элемента. По умолчанию в центре.
    y[необязательный] Координата Y для клика внутри элемента, относительно левого верхнего угла элемента. По умолчанию в центре.
    Теперь смотрим по каким параметрам можем найти контрол.

    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/. Однако у нее есть масса ограничений, которые мы щас попробуем обойти.
    [​IMG]

    Алгоритм работы во всех случаях один.
    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 )

    Code (text):
    1. var handle = AutoItX.WinGetHandle("Skype™‎ - ahvahsky2008");
    2. var editbox = AutoItX.ControlGetHandle(handle, "[CLASS:TSearchControl; INSTANCE:1]");
    3. AutoItX.WinActivate(handle);
    4. AutoItX.Send("test", 1);
    5.  
    иии.. Вуаля!

    111232222223.gif


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

    Полный код.
    Code (csharp):
    1. var handle = AutoItX.WinGetHandle("Technitium MAC Address Changer v6 - by Shreyas Zare");
    2. var listview = AutoItX.ControlGetHandle(handle, "[CLASS:ListView20WndClass; INSTANCE:10]");
    3. AutoItX.WinActivate(handle);
    4. var count = AutoItX.ControlListView(handle, listview, "GetItemCount", "", "");
    5. AutoItX.ControlListView(handle, listview, "Select", "0", "1");
    6.  
    7. var randomBtn = AutoItX.ControlGetHandle(handle, "ThunderRT6CommandButton7");
    8. AutoItX.ControlClick(handle, randomBtn);
    9.  
    10. var changeBtn = AutoItX.ControlGetHandle(handle, "ThunderRT6CommandButton6");
    11. AutoItX.ControlClick(handle, changeBtn);

    [​IMG]


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

    1) Получаем хендл окна по заголовку (Title)
    2) Нам надо форму привязать к верхней левой части окна
    3) Кликаем по 4 кнопке сверху
    upload_2016-12-20_11-53-11.png
    4) Кликаем по полю ввода для его активации
    5) Вводим номер телефона

    Code (csharp):
    1. var handle = AutoItX.WinGetHandle("Viber +79285533129");
    2. AutoItX.WinActivate(handle);
    3. AutoItX.WinMove(handle, 0, 0);
    4. AutoItX.MouseClick("LEFT", 278, 102);
    5. AutoItX.MouseClick("LEFT", 136, 183);
    6. AutoItX.Send("79285533129");
    Друзья, коллеги, форумчане. Каждый ваш голос это мотивация для написания таких же интересных статей) Я старался для вас)
     

    Attached Files:

    Last edited: Dec 20, 2016
    ZSHab, impul5e, alexandr939 and 73 others like this.
  2. Sanekk

    Sanekk Client

    Joined:
    Jun 24, 2016
    Messages:
    572
    Likes Received:
    214
    Улетная тема,и в правду намного проще в освоении чем у Serkser,
    Radzhab спасибо за новое решение,буду копать)))
     
    Last edited by a moderator: Dec 20, 2016
    AlisaZ likes this.
  3. stanar

    stanar Client

    Joined:
    Dec 19, 2015
    Messages:
    293
    Likes Received:
    149
    Мотивированный трафик)
     
    AlisaZ and Radzhab like this.
  4. Chick80

    Chick80 Client

    Joined:
    Dec 4, 2014
    Messages:
    279
    Likes Received:
    66
    Какая версия AutoIT?
    Я его, было, похоронил вместе с ХР... А тут гляди-ка, живее всех живых...
     
    AlisaZ likes this.
  5. VerBin

    VerBin Client

    Joined:
    May 28, 2016
    Messages:
    316
    Likes Received:
    245
    Материал без сомнений интересен с технической стороны.
    Еще одна практическая статья по вариантам автоматизации не будет лишней.
     
    Last edited by a moderator: Dec 20, 2016
  6. masterLomaster

    masterLomaster Client

    Joined:
    Jul 8, 2015
    Messages:
    2,756
    Likes Received:
    607
    ага но для меня подмена времени на локальном ПК на 1 месте это 300% дальше думать буду )
     
    AlisaZ likes this.
  7. Chick80

    Chick80 Client

    Joined:
    Dec 4, 2014
    Messages:
    279
    Likes Received:
    66
    Уверен? :-)
    Если изменишь время в системе, Зенка работать откажется ;-)
     
    Radzhab likes this.
  8. Radzhab

    Radzhab Client

    Joined:
    May 23, 2014
    Messages:
    1,362
    Likes Received:
    1,040
    Так у него подмена - но не изменение.
     
  9. masterLomaster

    masterLomaster Client

    Joined:
    Jul 8, 2015
    Messages:
    2,756
    Likes Received:
    607
    такто VerBin в 6 конкурсе выложил отличное решение которое 100% на 1 место идет!

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

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

    VerBin Client

    Joined:
    May 28, 2016
    Messages:
    316
    Likes Received:
    245
    Благодарю за позитивную оценку, все-же прошу воздержатся от рекламы =)
    Все решения интересны.
    Каждый пользователь выберет то, что ему будет полезно.
    Спасибо.
     
    DenisK and AlisaZ like this.
  11. Chick80

    Chick80 Client

    Joined:
    Dec 4, 2014
    Messages:
    279
    Likes Received:
    66
    сорь, затупил ))) Подумал, что МастерЛомастер решил с помощью AutoIT время в системе менять :-)
     
    Radzhab likes this.
  12. masterLomaster

    masterLomaster Client

    Joined:
    Jul 8, 2015
    Messages:
    2,756
    Likes Received:
    607
    я не рекламирую ) я обсуждаю и высказываю свои мысли!
     
  13. Radzhab

    Radzhab Client

    Joined:
    May 23, 2014
    Messages:
    1,362
    Likes Received:
    1,040
    ) Каждый сам решает что ему интересно.
     
    masterLomaster likes this.
  14. nvmds

    nvmds Client

    Joined:
    May 4, 2016
    Messages:
    37
    Likes Received:
    2
    Спасибо за статью. А таким способом можно дожидаться появления какого-то элемента?
     
  15. Radzhab

    Radzhab Client

    Joined:
    May 23, 2014
    Messages:
    1,362
    Likes Received:
    1,040
    Можно сделать так. В цикле смотреть нет ли нового элемента.
    for (...)
    {
    if (AutoItX.WinGetHandleAsText()!="")
    {
    // Если элемент появился - то работаем с ним.
    }
    }
     
  16. AloneSlamer

    AloneSlamer Client

    Joined:
    Jan 29, 2013
    Messages:
    1,441
    Likes Received:
    352
    А как сделать спамер если я хочу постить в приложении которое разворачивается на весь экран?
     
  17. Radzhab

    Radzhab Client

    Joined:
    May 23, 2014
    Messages:
    1,362
    Likes Received:
    1,040
    Что за приложение? Да и не думаю что проблемы возникнут какие то.
     
  18. Radzhab

    Radzhab Client

    Joined:
    May 23, 2014
    Messages:
    1,362
    Likes Received:
    1,040
    Версию врядли скажу. Насчет актуальности - сообщество автоитеров очень активно развивается.
     
  19. Astraport

    Astraport Client

    Joined:
    May 1, 2015
    Messages:
    1,820
    Likes Received:
    1,105
    С AutoIt у меня есть один опыт. Когда-то очень давно сделал коммерческую прогу для создания коллажей открыток, а сохранение в картинку никак не получалось. Нагуглил АвтоИт, сделал скрипт, ну и запустил прогу в продакшен, деньги потратил на раскрутку, а толку почти нет. Оказалось, что пара популярных антивирусов определяла прогу как имеющую вирусы и именно экзешник созданного AutoIt скрипта давал такой результат.
     
    AlisaZ likes this.
  20. Radzhab

    Radzhab Client

    Joined:
    May 23, 2014
    Messages:
    1,362
    Likes Received:
    1,040
    Exe пакуется чем то. Поэтому и палится
     
  21. DenisK

    DenisK Client

    Joined:
    Jun 28, 2016
    Messages:
    239
    Likes Received:
    85
    Спасибо интересно!

    Чем ближе конкурс к концу тем качественнее контент)
     
    Radzhab likes this.
  22. Radzhab

    Radzhab Client

    Joined:
    May 23, 2014
    Messages:
    1,362
    Likes Received:
    1,040
    Неужели никто не начал тестить?)
     
    alena91 and riptup like this.
  23. Dimionix

    Dimionix Moderator

    Joined:
    Apr 9, 2011
    Messages:
    2,874
    Likes Received:
    2,226
    Вот если бы данное решение "не отбирало мышку", то однозначно цены бы не было, а так есть разного рода автокликеры.
    Но всё же, так как в данном случае обходимся без лишнего софта + статья написана очень хорошо - приятно читать - Спасибо и лайк!
     
    Radzhab and riptup like this.
  24. Radzhab

    Radzhab Client

    Joined:
    May 23, 2014
    Messages:
    1,362
    Likes Received:
    1,040
    Отбирает мышь только если кликать по координатам. Если кликать по контролам проблем нет
     
    bizzon, riptup and Dimionix like this.
  25. WebBot

    WebBot Client

    Joined:
    Apr 4, 2015
    Messages:
    538
    Likes Received:
    227
    Имхо это лучшая статья в шестом конкурсе статей, буду голосовать за нее!
     
  26. riptup

    riptup Client

    Joined:
    Jan 24, 2013
    Messages:
    493
    Likes Received:
    38
    На передний план окно программы выводит, но лучше чем отбирание мышки:az:
     
    Last edited: Dec 20, 2016
  27. Karamzin

    Karamzin Client

    Joined:
    May 24, 2016
    Messages:
    58
    Likes Received:
    85
    огромное спасибо за отличные статьи в каждом конкурсе.
     
    Radzhab likes this.
  28. EccoArts

    EccoArts Client

    Joined:
    Apr 7, 2016
    Messages:
    22
    Likes Received:
    8
    У меня с AutoIT всё и начиналось, первый боты для игр таких как WoW :-)
    Был сделан скрипт по сбору ресурсов.
     
    Radzhab likes this.
  29. Mr-Grey

    Mr-Grey Client

    Joined:
    Feb 3, 2016
    Messages:
    84
    Likes Received:
    5
    Офигенная вещь. Спасибо!
     
    Radzhab likes this.
  30. GoldenEagle

    GoldenEagle Новичок

    Joined:
    Apr 16, 2016
    Messages:
    24
    Likes Received:
    3
    а если это андройд эмулятор как то получить значения из него можно?
     

Пользователи просматривающие тему (Пользователей: 0, Гостей: 0)