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

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



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Isiro
    Я не слишком гуру в AutoIt3. Для себя использовал, возможно и Вам пример поможет, а скачать там же можно библиотеку.
    https://www.autoitscript.com/forum/topic/103871-_systray-udf/?page=1
    Эта библиотека помогает кликнуть по иконке в трее, найти всё и прочее в трее... Попробуйте разобраться, если что конкретное - попробую помочь.

    Всего записей: 1386 | Зарегистр. 07-07-2012 | Отправлено: 14:53 28-12-2016
    Isiro



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

    Всего записей: 7 | Зарегистр. 15-12-2005 | Отправлено: 22:23 28-12-2016 | Исправлено: Isiro, 22:23 28-12-2016
    AZJIO



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

    Цитата:
    генерацией чекбоксов

    http://pastebin.com/cBna5Sv3
     
    там радиокнопка, просто заменить на чекбокс.
     

    Всего записей: 4407 | Зарегистр. 03-05-2006 | Отправлено: 16:53 30-12-2016
    Skif_off

    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AZJIO
    Спасибо, кажется, это тот самый пример
    Т.е., ID контролов всегда раздаются по порядку создания?

    Всего записей: 6462 | Зарегистр. 28-01-2008 | Отправлено: 20:01 30-12-2016
    AZJIO



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

    Цитата:
    раздаются по порядку создания?

    Из проб я понял что именно создаются по-порядку. А как иначе, там скорее всего внутренний механизм, тоже типа массив, который заполняется по мере создания элементов и при удалении GUI видимо все элементы удаляются обсчитывая массив. При закрытии Autoit проверят всё что он насоздавал (окна элементы) и по умолчанию если в них есть что, то он удаляет. Судя по заявлению, что "несмотря на то что Autoit закрывает свои открытые дескрипторы, окна и т.д. все равно рекомендуется использовать GUIDelete
    Вообще элементы GUI (кнопки чекбоксы и т.д.) являютя тоже окнами, они все имеют дескриптор не отличающийся от GUI. Система Windows работает с дескрипторами. А Autoit тебе возвращает число... Из этого вывод: Autoit содержит массив-связь "число:дескриптор", когда ты обращаешься к числу, Autoit находит его дескриптор в массиве и работает с дескриптором. А для нас снаружи всё подается в простых понятных основных параметрах. Сравни эти же кнопки в UDF, там они имеют дескриптор, кучу сообщений что с ними происходит для различных событий, куча параметров-стилей, UDF это как бы подноготня реальной кнопки.

    Всего записей: 4407 | Зарегистр. 03-05-2006 | Отправлено: 15:54 31-12-2016 | Исправлено: AZJIO, 16:02 31-12-2016
    Fantasy22



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Здравствуйте! С наступившим Новым годом!
    Подскажите как сделать Label, чтобы при наведении на него курсором он подчеркивался, как ссылка в браузере

    Всего записей: 41 | Зарегистр. 24-10-2007 | Отправлено: 10:26 02-01-2017
    AZJIO



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

    Всего записей: 4407 | Зарегистр. 03-05-2006 | Отправлено: 17:47 03-01-2017 | Исправлено: AZJIO, 17:49 03-01-2017
    Fantasy22



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    AZJIO имелось виду не много другое. И все же спасибо за отклик.
    Парни из соседнего ресурса помогли.

    Код:
     
    #RequireAdmin
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
     
    Local $iTrigg, $Cur, $Label1, $Form1
     
    $Form1 = GUICreate("Form1", 333, 141, -1, -1, -1, $WS_EX_COMPOSITED)
    $Label1 = GUICtrlCreateLabel("Программа", 112, 48, 106, 17)
    GUICtrlSetColor(-1, 0x0000FF)
    GUICtrlSetFont(-1, 9, 300, 0)
    GUICtrlSetCursor(-1, 0)
    GUISetState()
     
    While 1
       $Cur = GUIGetCursorInfo()
       If Not @error Then ; при опросе функции в цикле очень полезно
          If $Cur[4] = $Label1 Then
             If Not $iTrigg Then
                GUICtrlSetColor($Label1, 0x0000FF)
                GUICtrlSetFont($Label1, 9, 300, 4)
                $iTrigg = 1
             Endif
          Else
             If $iTrigg Then
                GUICtrlSetColor($Label1, 0x0000FF)
                GUICtrlSetFont($Label1, 9, 300, 0)
                $iTrigg = 0
             Endif
          EndIf
       EndIf
     
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                Exit
            Case $Label1
                Run("notepad.exe")
        EndSwitch
    WEnd
     

    Всего записей: 41 | Зарегистр. 24-10-2007 | Отправлено: 22:36 03-01-2017
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Fantasy22
    Наведение можно ещё через WM_NOTIFY обработать

    Всего записей: 4407 | Зарегистр. 03-05-2006 | Отправлено: 18:13 04-01-2017
    Skif_off

    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Кто-нибудь может понятно объяснить, зачем и в каких случаях возвращать $GUI_RUNDEFMSG?
    Понял, что если возвращать, то сообщение после завершения функции будет обработано внутренним обработчиком AutoIt, а зачем, если оно уже обработано пользовательской функцией?

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



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Skif_off
    На одно "сообщение" можно повесить несколько функций. Чтобы все они адекватно срабатывали надо возвращать $GUI_RUNDEFMSG. Возможно я ошибаюсь, но порядок выполнения функций случайный.

    Всего записей: 452 | Зарегистр. 03-12-2007 | Отправлено: 23:50 09-01-2017
    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_* беру готовые или подсказанные и проблем пока не было, а будут - начнёт доходить...

    Всего записей: 6462 | Зарегистр. 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, который вообще-то и должен реагировать, т.к. это сообщение для него?

    Всего записей: 6462 | Зарегистр. 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 раз, но не факт, может неправильно функцию написал. жаль что они не обьясняют причин, и приходится не обращать внимание, работает без неё и фиг с ней. А объяснили бы глядишь имело бы смысл, ради чего напрягать пальцы.

    Всего записей: 4407 | Зарегистр. 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]))

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

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



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

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

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

    Всего записей: 6462 | Зарегистр. 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
       

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