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

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



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    madmasles
    Благодарю. Сделал, как сказали – работает отлично.
     
    Ещё просьба.
    Как сделать, чтобы при нажатии на клавишу Ctrl выполнялась одна функция, а при отжатии – другая?
    Пример: Кнопка «Start» -> Нажимаю Ctrl – надпись на кнопке меняется на «Set» -> Отпускаю Ctrl – надпись меняется на «Start».
    Я так понимаю, что это что-то с кодами сообщений Windоws надо ваять. Интуитивно догадываюсь, что наверное это WM_IME_KEYDOWN и WM_IME_KEYUP. Но как дальше... боюсь потрачу неделю на перелопачивание литературы и так ничего и не пойму...

    Всего записей: 2768 | Зарегистр. 20-03-2008 | Отправлено: 12:40 26-09-2014
    NIKZZZZ



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    yozhic
     
    Проверить нажатие клавиши с помощью _IsPressed()

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 13:18 26-09-2014
    yozhic



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    NIKZZZZ
    Не могу понять в чём дело. Как то странно отрабатывает.

    Код:
    While $g_iTimerShow = 1
            If _IsPressed("11", $g_hDll) Then
                $g_sTimerBtnLabel = "SET"
                GUICtrlSetData($g_hTimerBtn, $g_sTimerBtnLabel)
                While _IsPressed("11", $g_hDll)
                    Sleep(10)
                WEnd
                $g_sTimerBtnLabel = "START"
                GUICtrlSetData($g_hTimerBtn, $g_sTimerBtnLabel)
            Else
                If $g_sTimerBtnLabel = "START" Then
                    Sleep(100)
                ElseIf $g_sTimerBtnLabel = "STOP" Then
                    $nTimeStart = TimerInit()
                    fn_TimerRoutine()
                    Sleep(1000 - TimerDiff($nTimeStart))
                EndIf
            EndIf
        WEnd

    При нажатии на Ctrl скрипт просто замирает, т.е. никакие команды не выполняются. Как отпускаю Ctrl, тогда только отрабатывает блок с изменением надписи.
     
    Добавлено:
    Причём и пример из справки по _IsPressed не отрабатывает корректно. При нажатии на клавишу ничего не происходит и только после того как отпущу, в консоль прописываются две строки: «Клавиша нажата», «Клавиша отпущена».
     
    Видимо какие то у меня аппаратные особенности, п.ч. на другой машине всё отрабатывает на ура (и пример из справки, и мой скрипт). Есть ли другой способ проверить нажатие клавишы?

    Всего записей: 2768 | Зарегистр. 20-03-2008 | Отправлено: 20:31 27-09-2014
    NIKZZZZ



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

    Код:
    #include <Misc.au3>
     
    $hSplash=SplashTextOn("Press Ctrl", "Message goes here.")
     
    While 1
         ControlSetText("Press Ctrl", "", "Static1","Ctrl status : " & _IsPressed ("11"),$hSplash)
        Sleep(100)
    WEnd

     

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 21:07 27-09-2014 | Исправлено: NIKZZZZ, 21:11 27-09-2014
    yozhic



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Та ж беда Нажимаю Ctrl - ноль эмоций. Отпускаю Ctrl - надпись на секунду меняется на True и сразу же обратно на False.

    Всего записей: 2768 | Зарегистр. 20-03-2008 | Отправлено: 21:26 27-09-2014
    NIKZZZZ



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    yozhic
    Похоже виснет _IsPressed при нажатии Ctrl
     
    Проверь
     

    Код:
    #include <Misc.au3>
     
    $hSplash=SplashTextOn("Press Ctrl", "Message goes here.")
    $i=1
    While 1
        $i+=1
        ControlSetText("Press Ctrl", "", "Static1","Ctrl status : " & _IsPressed ("11") & "    Timer : " & $i ,$hSplash)
        Sleep(100)
    WEnd
     

     
    Добавлено:
    Да, и еще проверь на другой клавише, возможно висит еще какая-то программа перехвата.

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 21:36 27-09-2014
    yozhic



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    NIKZZZZ
    Спасибо, кажется понятно. На Alt/Ctrl/Shift виснет, а на другие клавиши (стрелки/буквы/цифры) откликается сразу. Я на виртуальной Windows работаю, так это, похоже, программа виртуализации (Parallels Desktop) своих перехватчиков навтыкала в систему. Запустил для проверки VirtualBox – из под него всё нормально отрабатывает.

    Всего записей: 2768 | Зарегистр. 20-03-2008 | Отправлено: 22:05 27-09-2014 | Исправлено: yozhic, 22:16 27-09-2014
    NIKZZZZ



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Я как-то выкладывал расширенные аналоги FileFindFirstFile() и FileFindNextFile() для поиска файлов, включая подкаталоги, обновил версию, может кому пригодится.
    FileFind.au3

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 20:11 28-09-2014 | Исправлено: NIKZZZZ, 08:19 29-09-2014
    thejustsoul



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

    Всего записей: 1789 | Зарегистр. 30-03-2014 | Отправлено: 05:30 29-09-2014 | Исправлено: thejustsoul, 21:54 30-09-2014
    Skif_off

    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    И снова я
    comrades, допустимо ли делать вызов функции так

    Код:
    If $var > 1 Then
        _FunctionName($var, 1)
    Else
        _FunctionName($var, 2)
    EndIf
    If @error ...

    или проверять @error нужно обязательно для каждого варианта отдельно?

    Всего записей: 6462 | Зарегистр. 28-01-2008 | Отправлено: 11:56 02-10-2014 | Исправлено: Skif_off, 11:57 02-10-2014
    NIKZZZZ



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

    Цитата:
    или проверять @error нужно обязательно для каждого варианта отдельно?

    В данном случае, необязательно, IF не меняет его значения.
     
    Но более корректно
     

    Код:
    If $var > 1 Then
      $iPar=1  
    Else
      $iPar=2
    EndIf
    _FunctionName($var, $iPar)
    If @error ...

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 12:11 02-10-2014
    madmasles

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Skif_off,
    Я бы в функции проверял значение $var.

    Всего записей: 1277 | Зарегистр. 25-09-2008 | Отправлено: 12:18 02-10-2014
    AZJIO



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

    Код:
    If StringRegExpReplace($sFindFile, "(?i)" & $avStack[1], "", 1) = "" And BitAND($avStack[2], 1) Then

     
    Функции типа BitAND($avStack[2], 2) зачем вычислять в итерации? Не проще ли зарезервировать 3-4 ячейки в массиве и вычислить 1 раз при инициализации.
    Если поставить флаг в условии первым, то ускорится должно заметно, потому что при отсекании условия по флагу не потребует проверки по регулярному выражению.

    Всего записей: 4407 | Зарегистр. 03-05-2006 | Отправлено: 12:49 02-10-2014 | Исправлено: AZJIO, 13:08 02-10-2014
    Skif_off

    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    NIKZZZZ
    madmasles
    Спасибо, что-то туплю, очевидно же. Добавил условный оператор в другом месте. Наверное, уже не научусь мыслить в правильном ключе

    Всего записей: 6462 | Зарегистр. 28-01-2008 | Отправлено: 13:14 02-10-2014
    NIKZZZZ



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AZJIO
    В принципе, ты прав. Но скорость в основном определяется в данном случае быстродействием диска, и, тот выигрыш, в десятые доли процента, не имеет особого значения, если , конечно, это не RAM диск. Но читаемость скрипта и универсальность окупают эти затраты.  

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 15:56 02-10-2014
    helbvtynec

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Имеется чужой скрипт с GUI. Проблема в том, что при запуске на окне нет клавиатурного фокуса: ни на одну клавишу не реагирует хотя в таскбаре окно активно. Если вручную активиравать другое окно, а потом назад переключится на окно скрипта, то появляется. Как это исправить?

    Всего записей: 414 | Зарегистр. 19-03-2008 | Отправлено: 00:15 03-10-2014
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    NIKZZZZ
    А как же кеширование? Если я делаю поиск по одному и тому же каталогу несколько раз, то скорость уже зависит чисто от алгоритма. Только первый поиск формирует кэш. Обращение к жёсткому диску фактически не к файлам, а к таблице файловой системы. Почему десятые доли процента? Если поиск по каталогам с несколькими тысячами файлов, то поиск уже не доли секунды, а к примеру 4 сек или 10 сек, а проценты заметные, 50% жрёт доступ к файлам, 50% жрёт регулярка, гдеж тут доли процента? К примеру скрипт Melda23 при поиске в неком контенте жрал 10 сек, после оптимизации поиска за счёт обработки регуляркой за один проход удалось сократить поиск по 4-5 сек. Из этих 4-5 сек легко замерить сколько жрёт регулярка так как всегда можно обработать список или массив отдельно. Отсюда вывод, в оптимизированном варианте 50 на 50. Если при поиске файлов предположить что число каталогов столько же сколько файлов, то исключая обработку каталогов регуляркой сэкономим 25%. Как раз таки проверка флага не ресурсоёмкая, 1000000 вызовов в секунду или даже лучше. Но возможно для новой версии автоита разрыв меньше, потому что в бета версии включили кэширование регулярки и исключено преобразование между ASCII и юникода. Хотя при тесте скрипта Melda23 я не заметил увеличения скорости, тайминги были теже, но я тестировал до фичи "кеширование регулярки".
     
    helbvtynec
    Фокуса нет в поле ввода или окна? Потому что это разные вещи. Если в таскбаре активно, то и заголовок должен быть активен. Хотя вручную можно сделать неактивным, а таск бар активным, но кому это в голову придёт так делать. А вот вероятность неактивного поля ввода в окне вполне вероятно, его же надо активировать в скрипте установкой GUICtrlSetState с параметром $GUI_FOCUS или $GUI_DEFBUTTON

    Всего записей: 4407 | Зарегистр. 03-05-2006 | Отправлено: 07:29 03-10-2014 | Исправлено: AZJIO, 07:47 03-10-2014
    madmasles

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

    Цитата:
    Имеется чужой скрипт с GUI
    Вы бы этот скрипт показали сначала, а потом задавали по нему вопросы.

    Всего записей: 1277 | Зарегистр. 25-09-2008 | Отправлено: 09:33 03-10-2014
    bobojon



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Добрый день, уважаемые форумчане.
    Необходима Ваша  помощь чайнику.
    Необходим скрипт, который будет делать следующее:
    В определенной папке (D:\Test) появляются файлы с названием ААХХХХХХХ.001, BBХХХХХХ.001 и ССCХХХХХ.001  
    Скрипт определяя файл который в начале начинается на АА и BB создает в корневом каталоге (C:\) текстовый файл с названием send.001 со следующей структурой:
     
    [from]
    Kolya
    [to]
    Ivan
    [subj]
    SEND FILE
    [text]
    Files
    [attach]
    D:\Test\MAIL\ААХХХХХХХ.001
    D:\Test\MAIL\BBХХХХХХХ.001
     
    а вот в случае с файлом у которого название начинается на CCC скрипт создает точно такой же текстовый файл (название другое send.002 чтобы не стереть предедущий файл) только значение Receiver_Name в создаваемом файле уже другой:
     
    [from]
    Kolya
    [to]
    Dima
    [subj]
    SEND FILE
    [text]
    Files
    [attach]
    D:\Test\MAIL\СССХХХХХХ.001
     
    Также нужно учесть, что в нашей папке с файлами могут появится одновременно несколько файлов с названиями ААХХХХХХХ. BBХХХХХХХ.  у них меняется только расширение 001, 002,003  (ААХХХХХХХ.001, ААХХХХХХХ.002)
     
    Буду очень благодарен, если Вы мне поможете.
    Заранее благодарен.
     
    Добавлено:
    Ребята, никто не хочет мне помочь? ((

    Всего записей: 53 | Зарегистр. 06-03-2008 | Отправлено: 09:58 03-10-2014
    helbvtynec

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AZJIO, madmasles
    Скрипт утилиты SetFolderDate для Total Commander (он длиннющий просто, поэтому не привел). Сам фокус в виде графической подсветки на кнопке есть, именно этими параметрами в коде установлен. Но Tab, Enter, стрелки, зарегистрированный на выход Esc и прочее не работают. Клики на самом окне (не на элементах) ни на что не влияют, после активирования окон туда-обратно фокус на подсвеченной кнопке по-умолчанию появляется — визуально к подсветке добавляется пунктир.

    Всего записей: 414 | Зарегистр. 19-03-2008 | Отправлено: 15:25 03-10-2014
       

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