Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Программы » AutoIT (Часть 3)

Модерирует : gyra, Maz

gyra (23-01-2020 10:51): AutoIT (Часть 4)  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200

   

Widok



Moderator-Следопыт
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

 
Описание:

Цитата:
AutoIt v3 - это язык для написания сценариев, напоминающий BASIC. Основным его назначением является автоматизация работ с Windows GUI (графическим интерфейсом пользователя MS Windows). Для выполнения этой сложной задачи предоставляется комбинация испытанных методов, включающих в себя эмуляцию нажатий комбинаций клавиш клавиатуры, перемещения указателя мыши, управление окнами и их визуальными элементами. Как показывает практика, эти "приводные ремни" весьма эффективны для получения работающих решений в ситуациях, когда другие стандартные средства (например, VBScript и SendKeys) оказываются бессильны.
Умеет он очень и очень многое! Бесплатный.

 
  • Справки
  • Инструменты
  • Ресурсы, посвящённые AutoIt
  • Полезные советы новичкам и не только
  • Готовые решения
  • Скрипт раскраски кода AutoIt для публикации в форумах
     


     
    За шапкой следит ViSiToR / AZJIO  

  • Всего записей: 24190 | Зарегистр. 07-04-2002 | Отправлено: 13:07 01-06-2010 | Исправлено: Maz, 12:29 10-01-2020
    NIKZZZZ



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    BOBAT

    Код:
    $hTimer = TimerInit()
    While 1
        If WinExists("1 — Блокнот", "") Then
            WinActivate("1 — Блокнот", "")
            MouseClick("left", 210, 320, 1, 18)
            Send('{ENTER 1}')
            Send("Дописываем в блокнот1")
            WinClose("1 — Блокнот", "")
            Send('{TAB 1}')
            Send('{ENTER 1}')
           $hTimer = TimerInit()
        EndIf
        If WinExists("2 — Блокнот", "") Then
            WinActivate("2 — Блокнот", "")
            MouseClick("left", 210, 320, 1, 18)
            Send('{ENTER 1}')
            Send("Дописываем в блокнот2")
            WinClose("2 — Блокнот", "")
            Send('{TAB 1}')
            Send('{ENTER 1}')
            $hTimer = TimerInit()
        EndIf
      ;Если за 5 секунд ничего не произшло, выход
      If TimerDiff($hTimer)>5000 Then ExitLoop
      Sleep(50)
    WEnd
     

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 10:21 31-08-2018 | Исправлено: NIKZZZZ, 10:22 31-08-2018
    Fom64

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    BOBAT

    Код:
     
    Opt("WinTextMatchMode", 2)
    ; Внутреннее название класса окна , работает лучше чем "Блокнот"
    $sHandle="[CLASS:Notepad]"
    ; заголовки окна
    $sTitle1 = "1 — Блокнот"
    $sTitle2 = "2 — Блокнот"
    ; новый текст
    $snewText1 = ""
    $snewText2 = ""
    ; Элемент управления Edit1, для классич блокнота, в других редакторах может быть и не Edit
    $hEdit = "Edit1"
    ; время ожидания окна в 1 итерации
    $itime = 5
    ; ----------
    $i = 1 ;счетчик
    Do
        $hWnd = WinWait($sHandle, "", $itime)
        $sTitle = WinGetTitle($hWnd)
        If $sTitle == $sTitle1 Then
            _ChangeTxt($snewText1)
        ElseIf $sTitle == $sTitle2 Then
            _ChangeTxt($snewText2)
        EndIf
        $i += 1
    Until $i = 12 ; время в секундах/$itime
     
    Func _ChangeTxt($snewText = "")
        ControlFocus($hWnd, "", $hEdit)
        $soldText = ControlGetText($hWnd, "", $hEdit)
        ControlSetText($hWnd, $soldText, $hEdit, "") ;типа очищаем текстовое поле
        ControlSetText($hWnd, "", $hEdit, $soldText & @CRLF & $snewText) ; @CRLF надо/не надо тебе, сам смотри
        WinClose($hWnd) ; здесь я чота не понял, текст же не сохраняется
    EndFunc   ;==>_ChangeTxt
     

    Всего записей: 262 | Зарегистр. 26-11-2010 | Отправлено: 11:04 31-08-2018 | Исправлено: Fom64, 12:07 31-08-2018
    Memfivosfey

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Fom64

    Цитата:
    Отлавливается, скорей всего не окно, а действия. Типа send из бота в окно клиента, нужна "прокладка".  
    Выше советовали. Попробуй переписать своего бота на WinApi.

    Так я спецом, ещё не посылал никаких команд клиенту и не делал никаких обращений, просто скомпилил пустой файл. Он отлавливает именно какие-то метки, самого AutoIt в Памяти.

    Всего записей: 352 | Зарегистр. 11-02-2005 | Отправлено: 12:06 31-08-2018
    BOBAT



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    BOBAT  Код:   Opt("WinTextMatchMode", 2)  ; заголовки окна  $sTitle1 = "1 — Блокнот"  $sTitle2 = "2 — Блокнот"  ; новый текст  $snewText1 = ""  $snewText2 = ""  ; Элемент управления Edit1, для классич блокнота, в других редакторах может быть и не Edit  $hEdit = "Edit1"  ; время ожидания окна в 1 итерации  $itime = 5  ; ----------  $i = 1 ;счетчик  Do      $hWnd = WinWait("Блокнот", "", $itime)      $sTitle = WinGetTitle($hWnd)      If $sTitle == $sTitle1 Then          _ChangeTxt($snewText1)      ElseIf $sTitle == $sTitle2 Then          _ChangeTxt($snewText2)      EndIf      $i += 1  Until $i = 12 ; время в секундах/$itime    Func _ChangeTxt($snewText = "")      ControlFocus($hWnd, "", $hEdit)      $soldText = ControlGetText($hWnd, "", $hEdit)      ControlSetText($hWnd, $soldText, $hEdit, "") ;типа очищаем текстовое поле      ControlSetText($hWnd, "", $hEdit, $soldText & @CRLF & $snewText) ; @CRLF надо/не надо тебе, сам смотри      WinClose($hWnd)  EndFunc   ;==>_ChangeTxt  

    У меня ничего не работает, кроме времени жизни скрипта
     
    Добавлено:
    NIKZZZZ
    Всё работает идеально!!! Большое спасибо!!!

    Всего записей: 1511 | Зарегистр. 07-08-2005 | Отправлено: 12:07 31-08-2018 | Исправлено: BOBAT, 12:18 31-08-2018
    Fom64

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Memfivosfey
    Тогда бесполезно, считаю. Можь язык сменить, питон например
     
    Добавлено:
    BOBAT
    Исправил, чота "Блокнот" не ловился) Только вот у тебя WinClose в цикле, новый текст же не сохраняется, иль так надо?

    Всего записей: 262 | Зарегистр. 26-11-2010 | Отправлено: 12:12 31-08-2018
    BOBAT



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    Исправил, чота "Блокнот" не ловился) Только вот у тебя WinClose в цикле, новый текст же не сохраняется, иль так надо?

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

    Всего записей: 1511 | Зарегистр. 07-08-2005 | Отправлено: 12:20 31-08-2018 | Исправлено: BOBAT, 12:24 31-08-2018
    NIKZZZZ



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    BOBAT

    Цитата:
    но никаких действий не делает кроме закрытия блокнота

    Скорее всего MouseClick("left", 210, 320, 1, 18) делает окно неактивным.

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 12:31 31-08-2018
    BOBAT



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    NIKZZZZ
    Спасибо большое, всё работает идеально, я тут накосячил со вставкой текста

    Всего записей: 1511 | Зарегистр. 07-08-2005 | Отправлено: 12:38 31-08-2018 | Исправлено: BOBAT, 13:08 31-08-2018
    Fom64

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    BOBAT

    Цитата:
    но никаких действий не делает кроме закрытия блокнота

    Ну так закоменть WinClose() в функции, добавь в переменную $snewText1 какой нидь текст, он его и напечатает столько, сколько кол-во итераций)
    ЗЫ: Ты бы конкретней написал, что тебе нужно, а то получается гадание на пяльцах

    Всего записей: 262 | Зарегистр. 26-11-2010 | Отправлено: 12:43 31-08-2018 | Исправлено: Fom64, 12:45 31-08-2018
    BOBAT



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    ЗЫ: Ты бы конкретней написал, что тебе нужно, а то получается гадание на пяльцах  

    Мне нужно, чтобы в цикле ожидалось появление окна с конкретным заголовком (для примера я выбрал Блокнот, но это может быть совершенно другое окно приложения), чтобы если окно появилось - произвести какие то действия (в моём примере это дописывание текста в блокнот и его закрытие), после выполнения действий необходимо опять перейти в цикл и ожидать другого или же и этого окна, окна могут появляться независимо от их очереди в коде, одно окно может появиться 3 раза или 1 или вообще не появиться, тогда выполняем цикл до истечения срока таймера, либо в одном из условий при нахождении конкретного окна можно вставить действие на закрытие скрипта и он закроется
    Вообще то код от NIKZZZZ прекрасно работает, я могу добавлять сколько угодно циклов, есть таймер и всё работает. Большое спасибо за помощь, на этом наверное остановимся

    Всего записей: 1511 | Зарегистр. 07-08-2005 | Отправлено: 12:54 31-08-2018 | Исправлено: BOBAT, 13:19 31-08-2018
    NIKZZZZ



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    BOBAT

    Цитата:
    после выполнения действий необходимо опять перейти в цикл и ожидать другого или же и этого окна

    Если окно не закрывается, то в цикле для него всегда будут выполняться указанные действия, или требуется выполнить их однократно при появлении нового окна?
     

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 13:25 31-08-2018
    BOBAT



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    Цитата: после выполнения действий необходимо опять перейти в цикл и ожидать другого или же и этого окна   Если окно не закрывается, то в цикле для него всегда будут выполняться указанные действия, или требуется выполнить их однократно при появлении нового окна?  

    Если окно не закрывается, значит код, который прописан для этого окна ещё выполняется, после выполнения всё идёт по кругу. Да это уже неважно, Ваш скрипт реально работает, всё отрабатывает правильно, спасибо!!!

    Всего записей: 1511 | Зарегистр. 07-08-2005 | Отправлено: 13:46 31-08-2018 | Исправлено: BOBAT, 13:48 31-08-2018
    NIKZZZZ



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    BOBAT

    Цитата:
    Да это уже неважно

    В принципе, вот более правильный и универсальный скрипт

    Код:
    $hTimer = TimerInit()
    $hWin1 = 0
    $hWin2 = 0
    While 1
        $hXX = WinExists("Блокнот", "")
        If $hWin1 <> $hXX Then
            $hWin1 = $hXX
            If $hXX Then
          ;Действия
          ;ExitLoop ;закончить цикл, если нужно
            EndIf
        EndIf
        $hXX = WinExists("Блокнот2", "")
        If $hWin2 <> $hXX Then
            $hWin2 = $hXX
            If $hXX Then
          ;Действия
          ;ExitLoop ;закончить цикл, если нужно
            EndIf
        EndIf
        ;Если за 5 секунд ничего не произшло, выход
        If TimerDiff($hTimer) > 5000 Then ExitLoop
        Sleep(50)
    WEnd
     


    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 13:50 31-08-2018
    Fom64

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    BOBAT
    Хз, не проверял)

    Код:
    ; Внутреннее название класса окна, при условии, что окно одного и того же приложения
    $sHandle="[CLASS:Notepad]" ; например
    ; время в секундах
    $itimeend = 20
    ; Заголовки окон
    $sTitle1=""
    $sTitle2=""
    $sTitle3=""
    ; время ожидания окна в цикле
    $itime=3
    ;--------
    $hTimer = TimerInit() ;запуск таймера
    Do
        $hWnd = WinWait($sHandle, "", $itime)
        Switch $sTitle = WinGetTitle($hWnd)
        Case $sTitle1
            <действия>
        Case $sTitle2
            <действия>
        Case $sTitle3
            <действия>
        EndSwitch
    Until TimerDiff($hTimer)=>$itimeend*1000  
     

    Всего записей: 262 | Зарегистр. 26-11-2010 | Отправлено: 13:59 31-08-2018
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Fom64

    Цитата:
    питон например  
    уж лучше PureBasic, синтаксис и подход похожий. А питон ещё и набор кучи файлов и заточенный под линукс.
     
    Memfivosfey
    Думаю они не такие глупцы, чтобы по иконке в трее судить о наличии запущенной проги, я бы даже сказал увидеть иконку в трее сложнее (?) чем получить процесс в памяти. Есть функции получения пути файла-процесса, и потом все процессы кроме системных можно получить пути на их файлы и посмотреть метку с конца, ну или его же прочитать в памяти, ещё быстрее. И как я понимаю метку не затрёшь. Можно попробовать старую версию AutoIt3, там вместо 6 вроде 5, но опять же не факт.
     
    BOBAT
    Может заинтересует функция AdlibRegister?

    Всего записей: 4411 | Зарегистр. 03-05-2006 | Отправлено: 15:31 31-08-2018
    BOBAT



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    BOBAT
    Может заинтересует функция AdlibRegister?

    Чем она может заинтересовать? Я сам накосячил со вставкой текста, когда исправил, всё стало нормально
    Есть у меня один вопрос: есть у меня скрипт, по очереди запускающий несколько приложений, между ними Sleep(6000) -
    например
    prog1.exe
    Sleep(6000)
    prog2.exe
    Sleep(6000)
    prog3.exe
    Sleep(6000) и т.д.
    так вот иногда (зависимости не заметил) стартует всё правильно, с ожиданием, иногда такое впечатление, что prog1 и prog2 стартуют одновременно, то есть сразу открываются 2 окна, но у меня стоит условие - всегда только одно окно - соответственно окно prog1 закрывается и я его не вижу, остальные программы стартуют соответственно их месту и паузы сохраняются. как заставить запустить prog1 подождать 6 сек потом запустить prog2?

    Всего записей: 1511 | Зарегистр. 07-08-2005 | Отправлено: 16:29 31-08-2018
    NIKZZZZ



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    BOBAT

    Цитата:
    иногда такое впечатление, что prog1 и prog2 стартуют одновременно

    Это неверно, стартуют с задержкой, а вот окно может появляться не сразу.
    Для этого запустите программу, с помощью WinWait дождитесь окна, а уж дальше  Sleep(6000) , к стати, в этом случае, думаю,  Sleep вообще не нужен.

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 16:44 31-08-2018
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    BOBAT
    гимп может минуту запускаться, так что что там ему 6 секунд. А если ещё параллельно что-то запускается, так вообще... После появления рабочего стола у меня 10-ка ещё минуту что-то грузит, жёсткий на полную катушку работает. Поставь "AnVir Task Manager" и включи датчики в трее комбинированную иконку и увидишь как всё грузится. Заодно скрипты будешь видеть нагружают ли процессор, много ли надо ему чтобы запустить пустой цикл и нагрузить под 100%.
    Так примитивно лучше в цикле грузить, кода меньше. Делаешь список путей, загружаешь данные из файла в массив строк, в цикле крутишь массив с задержкой времени. Но я бы лучше для каждой проги отдельно делал задержку и промежуток побольше, я же не начинаю ими работать в ту же секунду или даже минуту. И задержку на начало запуска, не в момент старта винды, а на 2 минуты позже. Можно замерить полную загрузку по погасанию датчика жёсткого диска и выставить это время для начала запуска прог.

    Цитата:
    Чем она может заинтересовать? Я сам накосячил со вставкой текста, когда исправил, всё стало нормально  
    я даже не смотрел, ты спрашивал можно ли параллельно что-то запустить, я дал функцию.

    Всего записей: 4411 | Зарегистр. 03-05-2006 | Отправлено: 17:48 31-08-2018 | Исправлено: AZJIO, 17:58 31-08-2018
    Fom64

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AZJIO

    Цитата:
    >питон например  
    уж лучше PureBasic, синтаксис и подход похожий. А питон ещё и набор кучи файлов и заточенный под линукс.  

    Может быть, но я таки понимаю они поднаторели на отслеживании ботов, чем нестадартней подход, тем лучше. Можь вообще в сторону lua надо глядеть иль ченидь поэкзотичней. Хотя загребешься с реализацией, конешно

    Всего записей: 262 | Зарегистр. 26-11-2010 | Отправлено: 17:56 31-08-2018
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Fom64

    Цитата:
     они поднаторели на отслеживании ботов
    PureBasic вроде по коду не поймёш на чём он написан, я конечно мало в нём разбираюсь, но если он конвертирует код в фасм, то есть асм, то есть уровень очень низкий, вроде как другие языки это тоже инструкции асм, так что можно сказать на любом языке. Хотя может специфика какая нибудь есть по ресурсам и т.д.

    Всего записей: 4411 | Зарегистр. 03-05-2006 | Отправлено: 18:04 31-08-2018
       

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200

    Компьютерный форум Ru.Board » Компьютеры » Программы » AutoIT (Часть 3)
    gyra (23-01-2020 10:51): AutoIT (Часть 4)


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru