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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
    Skif_off

    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите, пожалуйста, что не так с объектом Scripting.Dictionary: для экономии пробую объединить функции _WinAPI_GetParentProcess() и _WinAPI_GetProcessName() (AutoIt 3.3.8.1, WinAPIEx v.3.8_3380), чтобы не перебирать дважды список процессов, один из вариантов функции выдаёт ошибку

    Цитата:
    Error: The requested action with this object has failed

    Что не так с $oDict.Add? Подумал было, что первый процесс System с PID = 0 и такой ключ "не устраивает" объект, добавил условие  

    Код:
    If $iTmp <> 0 Then

    но всё равно ошибка. Проверял на Win7x32.
     
     
    jFobos
    Всё равно не очень понял Ну да ладно, всё равно функции WM_* беру готовые или подсказанные и проблем пока не было, а будут - начнёт доходить...

    Всего записей: 6496 | Зарегистр. 28-01-2008 | Отправлено: 22:21 13-01-2017 | Исправлено: Skif_off, 22:22 13-01-2017
    jFobos



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Skif_off
    Попробую немного иначе объяснить. Возможно с технической стороны все что напишу ниже не совсем корректно будет звучать, тут уж прошу меня простить
     
    Грубо говоря, в памяти есть некая область куда складываются системные сообщения. Они могут попадать туда из различных мест, от мышки, от клавиатуры, от других устройств, от различных программ и драйверов. И они просто складываются в этой области, как на складе каком-то и просто накапливаются (есть механизмы для очистки этой области, но не будем пока о них).
     
    Сами сообщения могут иметь параметры и различные свойства, могут быть общими или предназначаться кому-то конкретному. Они могут передавать какую-то информацию, или уведомлять о каком-то событие. Они могут использоваться для синхронизации потоков в рамках приложения или для синхронизации целых приложений и служб. В базе программы spy++ есть более тысячи видов этих сообщений.
     
    Большинство приложений постоянно мониторят этот склад сообщений. В том числе и avtoIt. Вообще постоянно, используют каждую возможность пробежаться по складу.
     
    И как только конкретное приложение находит сообщение предназначенное для него или в этом приложении есть реакция на это сообщение - оно (приложение) забирает сообщение со склада к себе. Обрабатывает его, как считает нужным. А после обработки приложение может удалить сообщение вовсе, или вернуть на склад (в оригинальном или модифицированном виде), или разместить на складе вообще новое сообщение (например информацию что старое сообщение было получено и вот результат его обработки).
     
    Суть в том, что если не вернуть $GUI_RUNDEFMSG на этот склад, то может случится так, что еще какая-то программа (или поток) которая ждет сообщение не дождется его и не выполнит своего предназначения

    Всего записей: 452 | Зарегистр. 03-12-2007 | Отправлено: 00:23 14-01-2017
    Skif_off

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

    Цитата:
    !!! If you want AutoIt to run its internal handler for a message, return the variable $GUI_RUNDEFMSG (in GUIConstantsEx.au3) from the function !!!
    !!! Если вы хотите, чтобы AutoIt выполнил внутренний обработчик для сообщения, возвратите переменную $GUI_RUNDEFMSG (в GUIConstantsEx.au3) из функции !!!

    речь не об общем складе, а о внутреннем обработчике AutoIt: т.е., получается, если перехватил своей пользовательской функцией, например, $NM_CLICK (первый раз увидел в обработке WM_NOTIFY с ListView), то без $GUI_RUNDEFMSG внутренний обработчик AutoIt не передаст $NM_CLICK собственно ListView, который вообще-то и должен реагировать, т.к. это сообщение для него?

    Всего записей: 6496 | Зарегистр. 28-01-2008 | Отправлено: 01:25 14-01-2017
    jFobos



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Skif_off
    В объяснении я много опустил. Этой общий склад не один, их куча, в разных местах и на разных логических уровнях. И структура этих складов также разная. И там еще куча нюансов. Я попытался объяснить общий принцип
     
    Если базироваться на вашем примере...
    На $NM_CLICK может быть "зацеплено" несколько функций-обработчиков. Ваша пользовательская функция, другие функции из библиотек, стандартные обработчики сообщений из гуи-контролов. Не факт что такие функции-обработчики есть, но также нет уверенности что их нету. Системы этих сообщений довольно сложная и там много вещей завязано.
     
    Допустим ваша функция заберет со склада $NM_CLICK и если не вернет его обратно, то остальные функции (которые должны были также обработать это сообщение) не сработают. Поэтому рекомендуется сообщение возвращать на склад.
    Если в ListView есть функция, что обрабатывает $NM_CLICK, то он также забирает сообщение со склада, обрабатывает его и возвращает назад. Чтобы и другие функции могли с этим сообщением поработать. Если же в ListView нету никакой рекции на $NM_CLICK, то он и трогать его не будет.
     
    Также поведут себя и остальные функции, заберут со склада, а потом вернут. И так будет продолжаться до тех пор, пока некий чистильщик мусора не решит, что сообщение $NM_CLICK никому не нужно и не уберет его со склада окончательно.
     

    Всего записей: 452 | Зарегистр. 03-12-2007 | Отправлено: 11:29 14-01-2017
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Skif_off
    Посмотри функцию _ClipBoard_ChangeChain, там есть строки
    ; If the next window is closing, repair the chain
    ; Otherwise pass the message to the next viewer
     
    ; Если следующее окно закрывается, восстановите последовательность
    ; Иначе передайте сообщение следующему просмотрщику
     
    Это меня когда то натолкнуло на мысль, что сообщение поглащается, хотя возможно смотря какие. Например бывает же, что некая клавиша обрабатывается двумя программами, хотя там может тоже восстановление последовательности.
     
    jFobos
    Как я понял из ранее изученного там не склад, а типа идёт поток сообщений... часто используется фраза "очередь". И этот поток мониторит каждое окно или тупо идёт поток цифр в виде таблицы тип-данные, как только тип соответствует зарегистрированному на приём, то программа смотрит что там пришло. Забирает ли она себе, то есть выкидывает его из очереди и не даёт следующему окну принять себе это правило нужно выяснять для конкретного случая. Например изменяю я размер окна, естественно лимит на изменение будет принимать активное окно, потому что с ним происходит действие, а вот провожу я мышь над поверхностью окон, тот вполне принимают все, ведь некоторые окна "видят" пролёт мыши над ними даже не являясь активными, а также работает прокрутка окна.
     
    Skif_off
     Написано ставить значит ставь. Но бывало что возврат приводит к неработающему функционалу. Вроде в имитаторе эксплорера была проблема 1 раз, но не факт, может неправильно функцию написал. жаль что они не обьясняют причин, и приходится не обращать внимание, работает без неё и фиг с ней. А объяснили бы глядишь имело бы смысл, ради чего напрягать пальцы.

    Всего записей: 4414 | Зарегистр. 03-05-2006 | Отправлено: 07:24 15-01-2017
    Skif_off

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

    Цитата:
    Написано ставить значит ставь.

    Дык и поставил бы, но сначала нужно было понять, зачем ставить и когда
     
     
    С проблемами с объектом Scripting.Dictionary вроде разобрался, вспомнив, что в VBScript ключом вроде как может быть только строка:

    Код:
    $oDict.Add(String($iTmp), DllStructGetData($tPROCESSENTRY32, 'ExeFile'))
    ...
    $aResult[1] = $oDict.Item(String($aResult[0]))

    Хотя в теме есть пример с ключами в виде цифр. Возможно, различия в ОСях?

    Всего записей: 6496 | Зарегистр. 28-01-2008 | Отправлено: 22:05 15-01-2017 | Исправлено: Skif_off, 22:07 15-01-2017
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Skif_off
    Почитай здесь. Забыл, хотя хотел сказать, что хендл это особый тип, он хоть и число/строка на вид, но не зря же есть функция преобразования в хендл - HWnd. Так что сохранить то можно, но будет ли это работать.

    Всего записей: 4414 | Зарегистр. 03-05-2006 | Отправлено: 02:27 16-01-2017
    Skif_off

    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AZJIO
    Оттуда и начал, но заработало только со String(), хотя вот пример с цифрами. Проверил $iTmp функцией VarGetType() - возвращает Int64: целое, но 64-битное. Наверное, надо было попробовать и Int() с флагом 1.

    Всего записей: 6496 | Зарегистр. 28-01-2008 | Отправлено: 07:06 16-01-2017
    Parazit111



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Как мне вызывать функции из скрипта-библиотеки?
     
    Допустим, что в скрипте присутствуют две функции. Если я его прямо запускаю, то срабатывают обе.
    Но мне нужна одна, конкретная.  Как должна выглядить командная строка (cmd.exe)?
     
    Func Timedate()
    ShellExecute('timedate.cpl', '', 'C:\WINDOWS\system32\', 'open')
    EndFunc
     
    Func Taskmgr()
    ShellExecute('taskmgr.exe', '', "C:\WINDOWS\system32", "open")
    EndFunc

    Всего записей: 36 | Зарегистр. 19-01-2017 | Отправлено: 00:47 19-01-2017
    Skif_off

    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Parazit111
    Как-то так и запускать скрипт с параметром?

    Код:
    If CmdLine[0] <> 1 Then Exit
    Switch $CmdLine[1]  
        Case 'timedate'
            Timedate()
        Case 'taskmgr'
            Taskmgr()
    EndSwitch
     
    Func Timedate()
        ShellExecute('timedate.cpl', '', 'C:\WINDOWS\system32\', 'open')
    EndFunc
     
    Func Taskmgr()
        ShellExecute('taskmgr.exe', '', "C:\WINDOWS\system32", "open")
    EndFunc

    Всего записей: 6496 | Зарегистр. 28-01-2008 | Отправлено: 01:07 19-01-2017
    Zmy111



    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Можно создать GUI

    Всего записей: 55 | Зарегистр. 19-09-2016 | Отправлено: 01:58 19-01-2017 | Исправлено: Zmy111, 02:00 19-01-2017
    Parazit111



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Skif_off, спасибо. Я знал этот способ. Я думал, что существует другой.

    Всего записей: 36 | Зарегистр. 19-01-2017 | Отправлено: 02:03 19-01-2017 | Исправлено: Parazit111, 02:06 19-01-2017
    Zmy111



    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Parazit111, ну какой другой? Сам подумай, как ты, кроме как параметров, сможешь объяснить AutoIt, что ты от него хочешь?
    Он же не волшебный. Он не умеет читать мысли и желания.  
    Если у тебя есть такая библиотека, то ты её можешь подключать к своим скриптам, используя #Include.
    А напрямую, кроме как с помощью параметров, не существует никаких способов.
     

    Всего записей: 55 | Зарегистр. 19-09-2016 | Отправлено: 02:12 19-01-2017 | Исправлено: Zmy111, 02:13 19-01-2017
    timsky



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

    Цитата:
    Я думал, что существует другой.

    Можно именовать AU3/ЕХЕ по-разному:
    Код:
    If @ScriptName = '1.au3' Then
        Timedate()
    ElseIf @ScriptName = '1.exe' Then
        Taskmgr()
    Else
        MsgBox(0, 'WTF?', @ScriptName)
    EndIf
     
    Func Timedate()
        ShellExecute('timedate.cpl', '', 'C:\WINDOWS\system32\', 'open')
    EndFunc  
       
    Func Taskmgr()
        ShellExecute('taskmgr.exe', '', "C:\WINDOWS\system32", "open")
    EndFunc

    Всего записей: 2287 | Зарегистр. 08-06-2004 | Отправлено: 12:23 19-01-2017
    VictorMan



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Пользуюсь AutoIT редко, поэтому каждый раз разбираюсь чуть не с нуля
    И вот сейчас туплю: как отследить нажатие кнопки в окне внешней программы?
    Думал, есть что-то вроде антипода ControlClick (ну, типа Wait...), но что-то не вижу.
    Ткните носом, или подскажите решение... плиз...

    Всего записей: 2447 | Зарегистр. 26-09-2001 | Отправлено: 22:46 19-01-2017
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    VictorMan
    такой функции нет. Можно по каким то критерием отследит окно, получить координаты нажимаемой кнопки. В момент появления окна получить "снимок" кнопки и следить за изменениями. Хотя тут и наведение мыши будет ловится. В общем задача сложная.мышь не покрывает всю кнопку сразу, но нажатие изменяет всю кнопку сразу. Тогда может мониторить три области кнопки, если именения происходят одновременно в 3-х, то - событие нажатия кнопки. При условии активности окна.

    Всего записей: 4414 | Зарегистр. 03-05-2006 | Отправлено: 17:14 20-01-2017 | Исправлено: AZJIO, 17:17 20-01-2017
    VictorMan



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AZJIO
    Спасибо.
    Да еще остается вопрос: нажатие кнопки привело ли к отработке действия, для которого предназначена кнопка - интересовало, собственно, именно это.  
    Я уже задавая вопрос заподозревал, что вопрос непростой...но решил спросить, мало-ли, вдруг кто-то юзерскую функцию написал.    
    Ладно, будем обходиться без этого, не смертельно.

    Всего записей: 2447 | Зарегистр. 26-09-2001 | Отправлено: 21:12 20-01-2017
    crt



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Спасибо. То, что надо.

    Всего записей: 22 | Зарегистр. 20-01-2017 | Отправлено: 01:02 21-01-2017
    king_stiven

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

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 01:22 21-01-2017 | Исправлено: king_stiven, 01:44 21-01-2017
    ck80

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Предыдущий админ уволился, не оставив пароля для Panaconic KX-TEM824.  
     
    Стандартный 1234 и различные частораспространненые вариации не подходят (0000, 123456 и т.д.). Сбрасывать АТС не хочется, потому что там все настроено и работает, но для дальнейшей настройки нужно знать пароль.  
     
    Пароль на АТС не сложный должен быть. Ограничения на пароль: от 4 до 6 символов, только цифры.  
     
    Вспомнил об AutoIT, набросал скрипт, но что-то он у меня не вставляет пароль в окошко ввода.
    Помогите, где я ошибся?
     
    ;--- AutoIt Macro Generator V 0.21 beta ---  
    #include <File.au3>  
    #include <Array.au3>  
    Dim $aPasswords  
     
    _FileReadToArray('c:\pass.txt', $aPasswords)  
    For $i = 1 To 10000 Step 1  
      Opt("WinTitleMatchMode", 4)  
      WinWait("Connect to PBX","Enter System Password :")  
      ControlClick("Connect to PBX","Enter System Password :","Edit1")  
      Send$aPasswords[$i])  
      ControlClick("Connect to PBX","Enter System Password :","Button6")  
      WinWait("KX-TE Maintenance Console","The system password is wrong.")  
      ControlClick("KX-TE Maintenance Console","The system password is wrong.","Button1")  
      WinWait("Connect to PBX","Enter System Password :")  
      ControlClick("Connect to PBX","Enter System Password :","Edit1")  
    Next  
    ;--- End ---

    Всего записей: 247 | Зарегистр. 03-07-2007 | Отправлено: 14:47 23-01-2017
       

    Страницы: 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