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

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



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AZJIO, благодарю, то что нужно.

    Всего записей: 452 | Зарегистр. 03-11-2011 | Отправлено: 15:37 01-02-2014
    gvshil

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите решить задачу:
    Скрипт проверяет наличие запущенного процесса и, если процесс запущен,  
    то при появлении окна (ошибки) - закрывает окно. Окно может появляться неоднократно.
    Когда процесс заканчивает свою работу - скрипт закрывается.
     

    Код:
    If ProcessExists ("Process.exe")Then
    While 1
    WinWait ("", "")
    WinActivate ("", "")
    ControlClick ("", "", "Button2")
    Wend
    Else ; какое должно быть условие, чтобы скрипт закрывается, если процесс заканчил свою работу
    EndIf

    Всего записей: 220 | Зарегистр. 30-04-2003 | Отправлено: 17:54 03-02-2014
    ynbIpb



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

    Код:
    While 1
        $iPid = ProcessExists ("Process.exe") ; определяем статус процесса
        If $iPid = 0 Then ; если 0, значит его нет
            Exit ; выходим
        Else ; иначе
            WinWait ("", "")
            WinActivate ("", "")
            ControlClick ("", "", "Button2")
        EndIf
        sleep (100) ; задержка, чтобы не грузить процессор
    Wend

    Всего записей: 1645 | Зарегистр. 01-05-2006 | Отправлено: 18:14 03-02-2014
    gvshil

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ynbIpb
    Спасибо за помощь, но скрипт не закрывается после закрытия процесса.
    Скрипт ожидает окно  
     WinWait ("", "")

    Всего записей: 220 | Зарегистр. 30-04-2003 | Отправлено: 18:28 03-02-2014
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    gvshil
    он не должен ожидать окно, потому что процесса нет и PID=0, по логике срабатывает выход. Если выход не сработал, движемся в обратном направлении в логической цепочке - значит PID не равен 0, а значит процесс существует. Процесс то может быть не один. Закрытие одного процесса не говорит, что процесс не существует.
    И это... надеюсь вы указали данные для WinWait? А то может вы ждёте неизвестно чего бесконечное время.
    По логике вы должны заранее получить дескриптор окна, а не получать его 1000-чи раз в цикле. А после получения исполнять только ControlClick, который действует без активности окна в большинстве случаев, и только если не работает с неактивным окном, только тогда думать об активации.

    Всего записей: 4409 | Зарегистр. 03-05-2006 | Отправлено: 18:57 03-02-2014 | Исправлено: AZJIO, 19:04 03-02-2014
    ynbIpb



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    gvshil, естественно нельзя оставлять WinWait ("", "")  пустым. нужно внести все необходимые данные и в догонку указать время ожидания окна, чтобы он не ждал бесконечно.

    Всего записей: 1645 | Зарегистр. 01-05-2006 | Отправлено: 19:04 03-02-2014
    gvshil

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    WinWait ("", "") конечно же не пустой.
    Дело в том, что окно появляется через произвольные промежутки времени.
     

    Цитата:
    По логике вы должны заранее получить дескриптор окна

    как реализовать ?

    Всего записей: 220 | Зарегистр. 30-04-2003 | Отправлено: 19:37 03-02-2014 | Исправлено: gvshil, 19:43 03-02-2014
    ynbIpb



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Можно пойти иным путём, не ждать окна, а просто проверять его существование в цикле

    Код:
    While 1
        $iPid = ProcessExists ("Process.exe") ; определяем статус процесса
        If $iPid = 0 Then ; если 0, значит его нет
            Exit ; выходим
        ElseIf WinExists ( "что-то там", "") Then ; иначе если окно существует
            WinActivate ("", "")
            ControlClick ("", "", "Button2")
        EndIf
        sleep (100) ; задержка, чтобы не грузить процессор
    Wend

    Всего записей: 1645 | Зарегистр. 01-05-2006 | Отправлено: 19:59 03-02-2014 | Исправлено: ynbIpb, 20:30 03-02-2014
    gvshil

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ynbIpb
    Так отлично!
    Благодарствуйте!

    Всего записей: 220 | Зарегистр. 30-04-2003 | Отправлено: 20:15 03-02-2014
    AZJIO



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

    Цитата:
    как реализовать ?
    не нужно в вашем случае. Окно появляется с разным дескриптором

    Всего записей: 4409 | Зарегистр. 03-05-2006 | Отправлено: 20:34 03-02-2014
    brain12345

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ребят, подскажите, что нужно подправить, чтоб МАС адрес вставал во второе поле (Внешняя ссылка на IPTV лист)?
     
     

    Код:
    #include <IE.au3>  
       
     $sMAC = 'c0:41:c3:d4:e5:f6'  
     $tUrl = 'http://brain123.okis.ru/file/brain123/full.m3u'  
     $sUrl = 'http://siptv.eu/mylist/'  
       
     $oIE = _IECreate($sUrl)  
     $oMAC = _IEGetObjById($oIE, 'MAC')  
     $ourl = _IEGetObjByName($oIE, 'url')  
       
     $oForm = _IEFormGetCollection ($oIE,1)  
       
     _IEFormElementSetValue($ourl, $turl)  
       
     $oInputs = _IETagNameGetCollection ($oForm, 'input');$oForm получен ранее  
     For $oInput In $oInputs  
         If $oInput.type = 'submit' And $oInput.value = 'Загрузить' Then  
             _IEAction($oInput, 'click')  
          _IELoadWait($oIE)  
     _IEFormElementSetValue($oMAC, $sMAC)  
     ExitLoop  
         EndIf  
     Next  
     _IELoadWait($oIE)

    Всего записей: 21 | Зарегистр. 29-03-2007 | Отправлено: 16:38 04-02-2014 | Исправлено: brain12345, 16:41 04-02-2014
    Artem_Butenko



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ребята, пожалуйста помогите разобраться с вопросом. Рассмотрим скрипт, который запускает некоторую программу, автоматизируя нажатия  
    контролов в ней.
     
    Ключевой исполняемый файл программы считывается из "*.ini-файла". Вопрос в том, что запуская 64-х битную версию файла, контролы будут уже другие. А сам скрипт будет выглядеть так.
     
    Генерировать отдельные "стартеры" для обеих разрядностей нежелательно, т.к. в 64-х битной ОС можно запустить как 32-х, так и 64-х битную версию программы. Как наиболее лаконично объединить эти скрипты, с учетом только того, что в 32-х и 64-х битных версиях программы изменяются имена классов контролов. Буду очень благодарен Вашей помощи.

    Всего записей: 711 | Зарегистр. 19-02-2008 | Отправлено: 04:11 06-02-2014 | Исправлено: Artem_Butenko, 04:12 06-02-2014
    dialmak



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

    Код:
    If @OSArch="X86" Then
    $control="TPanel4"
    Else
    $control="Wind42"
    EndIf

    Если же нужно ещё проверять exe на архитектуру, то можно по размеру проверку сделать.

    Всего записей: 14007 | Зарегистр. 27-04-2013 | Отправлено: 12:18 06-02-2014 | Исправлено: dialmak, 12:19 06-02-2014
    Kar1son

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    есть скрипт который работает с файлами EXCEL.  
    все работало норм. сейчас на WIN8.1 x64 функция _ExcelBookClose вроде срабатывает (закрывает с сохранением результатов) но выдается окошко с ошибкой Excel.  
    как поправить?
     
    нашел тему на автоитовском форуме
    http://www.autoitscript.com/forum/topic/118139-solved-excelbookclose-does-not-work-for-office-2010/
    они там разобрались из-за чего так происходит, но я не понимаю что сделать чтобы так не происходило.
    #AutoIt3Wrapper_UseX64=N
    не спасает...

    Всего записей: 187 | Зарегистр. 23-08-2006 | Отправлено: 12:47 06-02-2014
    Artem_Butenko



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    dialmak
     
    Можно увидеть полный вариант объединения предложенных скриптов в Вашей интерпретации?

    Всего записей: 711 | Зарегистр. 19-02-2008 | Отправлено: 16:52 06-02-2014
    dialmak



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

    Цитата:
    объединения предложенных скриптов

    Я к сожалению не знаю конкретики.  
    Разрядность exe можно также определить внешней утилитой. И далее действовать согласно полученных сведений.
    Например filever

    Всего записей: 14007 | Зарегистр. 27-04-2013 | Отправлено: 17:22 06-02-2014 | Исправлено: dialmak, 17:25 06-02-2014
    ynbIpb



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

    Код:
    #include <Process.au3>
     
    While 1
        If WinExists ("[TITLE:Total Commander; CLASS:TNASTYNAGSCREEN]") = 1 Then ; если окно существует
            $hTCnag = WinGetHandle ("[TITLE:Total Commander; CLASS:TNASTYNAGSCREEN]")
            $sTCname = _ProcessGetName(WinGetProcess ($hTCnag)) ; определяем имя процесса окна
            If $sTCname = "TOTALCMD.EXE" Then ; если это 32-х разрядная версия
                $sNum = ControlGetText($hTCnag, "", "TPanel2") ; то читаем номер с TPanel2
                ControlClick ($hTCnag, "","&"&$sNum)
            ElseIf $sTCname = "TOTALCMD64.EXE" Then ; иначе если это 64-х разрядная версия
                $sNum = ControlGetText($hTCnag, "", "Window4") ; то читаем номер с Window4
                ControlClick ($hTCnag, "","&"&$sNum)
            EndIf
        EndIf
        Sleep (100)
    WEnd

    тестил только на своей 32-х разрядной.

    Всего записей: 1645 | Зарегистр. 01-05-2006 | Отправлено: 22:25 06-02-2014
    MaxPowers

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Приветствую. Есть не тривиальная задача. Тому кто поможет решить - 100 рублей на телефон и +200 к карме.
     
    Есть около 15 окон с одинаковыми заголовками (название окна). Они периодически перезапускаются - это важно. Нужен скрипт, который переодически чекает окна на заголовок, находит не переименнованые (т.е. с начальным названием), затем переименовывает его с первым свободным добавочным номером (Proga > Proga - 1). Т.е. если 7-ое окно вылитело и через 5 минут запустилось, оно не должно стать 16-ым. Но если вылитело еще и 3-ье окно до перезапуска 7-ого, то 7-ое должно стать 3-им.
     
    У меня пока только так... руками.
     
    RenameWindows()
    Func RenameWindows()
    WinSetTitle("Proga", "", "Proga - 1")
    EndFunc

    Всего записей: 12 | Зарегистр. 10-03-2009 | Отправлено: 02:34 21-02-2014
    madmasles

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    MaxPowers,
    Можно примерно так попробовать сделать.
    Код:
    Opt('WinTitleMatchMode', 2);только для блокнота
     
    Global $fExit, $aWnd[1]
     
    HotKeySet('{Esc}', '_Exit')
    AdlibRegister('_CheckWnd', 500)
     
    While Not $fExit
        Sleep(500)
        If Random(0, 4, 1) = 4 Then Run('notepad.exe');рандомный запуск блокнота для проверки, уберите эту строку
    WEnd
     
    For $i = 1 To $aWnd[0]
        If WinExists($aWnd[$i]) Then WinClose($aWnd[$i])
    Next
     
    Func _CheckWnd()
        Local $s_Title = 'Блокнот', $a_Win, $s_StrHandle = '|'
        ;поменяйте на Ваш заголовок
        If $aWnd[0] Then
            For $i = 1 To $aWnd[0]
                If WinExists($aWnd[$i]) Then
                    $s_StrHandle &= $aWnd[$i] & '|'
                Else
                    $aWnd[$i] = 0
                EndIf
            Next
        EndIf
        $a_Win = WinList($s_Title)
        If Not $a_Win[0][0] Then Return
        For $i = 1 To $a_Win[0][0]
            If StringInStr($s_StrHandle, '|' & $a_Win[$i][1] & '|') Then
                ContinueLoop
            EndIf
            For $j = 1 To $aWnd[0]
                If Not $aWnd[$j] Then
                    $aWnd[$j] = $a_Win[$i][1]
                    WinSetTitle($aWnd[$j], '', $s_Title & ' - ' & $j)
                    ContinueLoop 2
                EndIf
            Next
            $aWnd[0] += 1
            ReDim $aWnd[$aWnd[0] + 1]
            $aWnd[$aWnd[0]] = $a_Win[$i][1]
            WinSetTitle($aWnd[$aWnd[0]], '', $s_Title & ' - ' & $aWnd[0])
        Next
    EndFunc   ;==>_CheckWnd
     
    Func _Exit()
        $fExit = True
    EndFunc   ;==>_Exit

    Всего записей: 1277 | Зарегистр. 25-09-2008 | Отправлено: 09:17 21-02-2014
    MaxPowers

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    На первый запуск сработало. Ночью еще потестирую на пред. перевключений окон. Номер телефона в ЛС.

    Всего записей: 12 | Зарегистр. 10-03-2009 | Отправлено: 22:04 21-02-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