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

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

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

Widok (12-01-2009 14:47): лимит страниц. продолжаем здесь  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

AddXL

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

AutoIt3

 
Домашняя страница: http://www.autoitscript.com
Страница загрузки: http://www.autoitscript.com/autoit3/downloads.php
 
Описание:

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

 
Помощь по AutoIT:
  • Справку на русском (и не только) вы всегда(?) сможете найти тут
  • Справочник по командам rundll32
  • Русский справочник по API-функциям
  • Помощь по Регулярным выражениям
  • AutoIt v3: Your Quick Guide (652 КБ) - Ваш быстрый гид в мир AutoIt-а (книга в формате pdf)
     
    Инструметы для AutoIt:
  • AutoIt3Wrapper [Страница закачки] - Программа для компилляции скрипта с дополнительными возможностями (добавление иконки, описании и т.п).
  • Koda (724 Kb) - Визуализация работы с GUI - аналог Visual Basic.
  • CodeWizard (400 Kb) - нечто простенькое на вариант Koda.
  • AutoItMacroGenerator (34 Kb) - Записывает в реальном времени действия пользователя в AutoIt код.
  • ScriptWriter (78 Kb) - Аналог AutoItMacroGenerator.
  • API Constants (1042 Kb) - Утилита для просмотра всех констант API-Функции и не только.
  • Страница закачки утилит которые идут в отдельной поставке редактора SciTE.
  • AutoIt меню для браузера Opera
     
    Готовые скрипты и программы с открытым кодом на AutoIt:
  • Коллекция AutoIt скриптов от Sanja Alone
  • Коллекция скриптов на http://msfn.org
  • Пополняющийся со временем сайт с полезными утилитами и функциями на AutoIt
  • Desktop Icons Restorator - Скрипт-Программа для сохранения/восстановления позиции иконок р.стола.
  • CaptureIt - Утилита предназначена для захвата изображений с вашего экрана.
  • SwitchIt - Скрипт для конвертирования выделенного текста
  • Скрипт расскраски кода AutoIt для публикации в форумах
     
    Общие вопросы и решения на Autoit:
  • Обработчик скриптов добавляющий отладчик (debugger)
  • Интеракция между несколькими скриптами
  • Пример использование интеракции между скриптами - Добавление элементов GUI с внешнего модуля
  • Копирование большого файла с отображением данных прогресса
  • Создание динамического меню в Tray Icon (значёк в области уведомления)
  • Пример создания своего мастера (Wizard)
  • Метод позволяющий запускать код VBS не создавая временных файлов
  • Описание функции GUIRegisterMsg()
  • Пример перехвата вводимых символов с клавиатуры
  • Пример деактивирования TabItem
  • Пример вывода лога в Edit-поле (с поддержкой форматирования текста)
  • Пример остановки/начало выполнения скрипта + Слежение за б.обмена с заменой неподдерживаемых в имени файла символов
  • Пример использования меню с иконками (ModernMenu.au3) -> Список программ в меню значка в системном трее
     
  • Как по PID процесса вычислить путь запускаемого файла
  • Получение IP по подключенному сокету
     
    Отдельные функции (UDF):
  • Функции Отключения/Подключения к Интернету
  • Функция проверки подключения к Интернету
  • Функция для получения структуры директории включая подкаталоги
  • Функция для поиска в файлах
  • Функция для смены разрешения экрана
  • Функция для смены раскладки клавиатуры в определённом окне
  • Функция для получения списка процессов с допол. инфой (путь к исполняемому файлу и др.)
  • Функции и пример для отображения детального процесса закачки файла
  • Функция (и пример использования) для отображения стильного диалога “О Программе” - [Усовершенствованная версия]
  • Функция возвращает пронумерованный список всех классов определённого окна + функция получения хендлов для этих классов
  • Функция для получения заголовка окна (или его идентификатора) по ID процесса (PID)
  • Функция _StringIsUTF8Format() + _StringToUTF() - Первая проверяет если строка содержится в UTF-8 формате, вторая преобразовывает строку в UTF-8 формат
  • Функция _FileOpenDialogEx - Возвращает массив (или строку) с полными путями к выбранным файлам
  • _AU3_Lib* Функции - Предназначены для обработки подключаемых библиотек через #include
  • Функция транслитерации строки
  • Расширенная библиотека для работы с реестром
     
    За шапкой следит ViSiToR  

  • Всего записей: 6 | Зарегистр. 24-11-2005 | Отправлено: 13:20 24-11-2005 | Исправлено: Maz, 11:50 17-04-2017
    gal7

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Посмотрите, пожалуйста можно ли еще усовершенствовать этот скрипт:
     
     

    Код:
    Global $COMBO = 0
    HotKeySet ("{F3}", "COMBO")
    Func COMBO()
       If $COMBO = 0 Then
          Global $COMBO = 1
          For $n = 1 To 8 Step 1
             If Eval("@GUI_CtrlId") AND @GUI_CtrlId = Eval("Combo" & $n) Then
                Local $idCOMBO = @GUI_CtrlId
                While 1
                   If GUICtrlSendMsg($idCOMBO, $CB_GETDROPPEDSTATE, 0, 0) = 1 Then
                      Local $COMBOnov = GUICtrlRead($idCOMBO)
                      If $COMBO <> $COMBOnov Then
                         ToolTip($COMBOnov, 10, 100)
                      EndIf
                   Else
                      ToolTip("")
                      Global $COMBO = 0
                      Return
                   EndIf
                   sleep(50)
                WEnd
             EndIf
          Next
          Global $COMBO = 0
       EndIf
    EndFunc

    Эта функция вызывается по вызову горячей клавиши. Сначала она ищет не нажат ли последней элемент combobox(у меня они $combo1-$combo8). А потом проверяет чтобы был открыт список.
     
    Я уже спрашивал недавно об отображении tooltip для строк combobox, но не все мне подошло в примере Maza Faka. Я например не хочу использовать общий цикл программы для постоянных проверок. В данной функции меня не устраивает то, что нужно сначала выбрать из списка какое-нибудь значение, и только потом если опять раскрыть список и нажать горячую кнопку, появится Tooltip. Еще может можно как-нибудь попроще без горячих клавиш и вставки в общий цикл программы обойтись для вызова функции?

    Всего записей: 145 | Зарегистр. 03-06-2007 | Отправлено: 21:06 13-11-2008 | Исправлено: gal7, 08:46 14-11-2008
    ViSiToR



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Tipulatoid 15:23 13-11-2008
    Цитата:
    И чего так все любят рапидшару?

    Реклама -> Заработк -> и т.д.

     
    Maza_Faka 17:31 13-11-2008
    Цитата:
    Залил на ftp, ссылка в шапке

    Обычно на прямые ссылке оставляют размер файла в скобках, для тех кто экономит трафик.
     
    P.S
    Долго эта книжка распространялась за 7$, то что её выложат рано или поздно на обменники (бесплатно), было очевидно


    ----------
    ViSiToR a.k.a CreatoR
    CreatoR это не ник, CreatoR это стиль жизни!

    Всего записей: 3251 | Зарегистр. 01-04-2006 | Отправлено: 00:33 14-11-2008 | Исправлено: ViSiToR, 01:05 14-11-2008
    Tipulatoid



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

    Цитата:
    Работает "Терминэйт", но не работает пауза ни в русской, ни в английской раскладках.

    У меня все работает. Пауза повешена на клавишу p (з) На клавише "Pause/Break" у меня Punto Switcher сидит, потому ее не использовал.

    Всего записей: 349 | Зарегистр. 22-12-2006 | Отправлено: 06:10 14-11-2008
    Maza_Faka



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

    Цитата:
    можно ли еще усовершенствовать этот скрипт


    Цитата:
    но не все мне подошло в примере Maza Faka

    Что за пример? Ссылочку пожалуйста, или запости его здесь.

    Всего записей: 1420 | Зарегистр. 25-10-2006 | Отправлено: 06:58 14-11-2008
    gal7

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

    Цитата:
    Что за пример


    Код:
    #include <GuiConstantsEx.au3>  
    #include <ComboConstants.au3>  
    #include <WindowsConstants.au3>  
     
    Global $sRead  
     
    $hGUI = GUICreate("Test GUI", 200, 100)  
     
    $CtlCombo = GUICtrlCreateCombo("Long Long Long Long Long Item 1", 50, 30, 100, 20)  
    GUICtrlSetData(-1, "Long Long Long Long Long Item 2|Long Long Long Long Long Item 3")  
     
    $OkButton = GUICtrlCreateButton("Ok", 11, 169, 75, 23)  
     
    $CloseButton = GUICtrlCreateButton("Close", 215, 169, 75, 23)  
     
    GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")  
     
    GUISetState()  
     
    While 1  
        $msg = GUIGetMsg()  
        Switch $msg  
            Case $GUI_EVENT_CLOSE  
                Exit  
            Case $OkButton  
                MsgBox(0, "", GUICtrlRead($CtlCombo))  
        EndSwitch  
     
        If (GUICtrlSendMsg($CtlCombo, $CB_GETDROPPEDSTATE, 0, 0) = 1) And (GUICtrlRead($CtlCombo) <> $sRead) Then  
            $sRead = GUICtrlRead($CtlCombo)  
            $aPos = WinGetPos(GUICtrlGetHandle($CtlCombo))  
            $iY = (GUICtrlSendMsg($CtlCombo, $CB_GETCURSEL, 0, 0) + 1) * 15 + 3  
            ToolTip($sRead, $aPos[0], ($aPos[1] + $iY))  
        EndIf  
    WEnd  
     
    Func WM_COMMAND($hWnd, $msg, $wParam, $lParam)  
        Local $iIDFrom = BitAND($wParam, 0x0000FFFF)  
        Local $iCode = BitShift($wParam, 16)  
     
        Switch $iIDFrom  
            Case $CtlCombo  
                Switch $iCode  
                    Case $CBN_CLOSEUP  
                        ToolTip("")  
                EndSwitch  
        EndSwitch  
     
        Return $GUI_RUNDEFMSG  
    EndFunc   ;==>WM_COMMAND  

    Всего записей: 145 | Зарегистр. 03-06-2007 | Отправлено: 08:35 14-11-2008
    Maza_Faka



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    gal7
    Честно говоря, вся эта идея попахивает извратом, ну не любитель я таких трюков

    Код:
    #include <GuiConstantsEx.au3>
    #include <ComboConstants.au3>
    #include <WindowsConstants.au3>
     
    Global $TimerProcHandle = DllCallbackRegister("_TimerProc", "none", "hwnd;int;int;dword")
     
    $hGUI = GUICreate("Test GUI", 200, 100)
     
    $CtlCombo = GUICtrlCreateCombo("Long Long Long Long Long Item 1", 50, 30, 100, 20)
    GUICtrlSetData(-1, "Long Long Long Long Long Item 2|Long Long Long Long Long Item 3")
     
    $hCombo = GUICtrlGetHandle($CtlCombo)
    $hEdit = DllCall("User32.dll", "hwnd", "FindWindowEx", "hwnd", $hCombo, "hwnd", 0, "ptr", 0, "ptr", 0)
    $hEdit = $hEdit[0]
     
    $OkButton = GUICtrlCreateButton("Ok", 11, 169, 75, 23)
     
    $CloseButton = GUICtrlCreateButton("Close", 215, 169, 75, 23)
     
    GUISetState()
     
    Global $TimerCall = DllCall("user32.dll", "int", "SetTimer", "hwnd", 0, "int", 0, "int", 100, _
                                "ptr", DllCallbackGetPtr($TimerProcHandle))
    $TimerCall = $TimerCall[0]
     
    While 1
        $msg = GUIGetMsg()
        Switch $msg
            Case $GUI_EVENT_CLOSE
                Exit
            Case $OkButton
                MsgBox(0, "", GUICtrlRead($CtlCombo))
        EndSwitch
    WEnd
     
    DllCallbackFree($TimerProcHandle)
    DllCall("user32.dll", "int", "KillTimer", "hwnd", 0, "int", $TimerCall)
     
    Func _TimerProc($hWnd, $Msg, $IdTimer, $dwTime)
        Local $hWndFrom, $sRead, $aPos, $iState, $iY
     
        $hWndFrom = DllCall("user32.dll", "hwnd", "WindowFromPoint", "int", MouseGetPos(0), "int", MouseGetPos(1))
        $sRead = GUICtrlRead($CtlCombo)
        $aPos = WinGetPos(GUICtrlGetHandle($CtlCombo))
        $iState = GUICtrlSendMsg($CtlCombo, $CB_GETDROPPEDSTATE, 0, 0)
     
        If $iState = 1 Then
            $iY = (GUICtrlSendMsg($CtlCombo, $CB_GETCURSEL, 0, 0) + 1) * 15 + 3
        Else
            $iY = -17
        EndIf
     
        If ($hWndFrom[0] = $hCombo) Or ($hWndFrom[0] = $hEdit) Or ($iState = 1) Then
            ToolTip($sRead, $aPos[0], $aPos[1] + $iY)
        Else
            ToolTip("")
        EndIf
    EndFunc

    Всего записей: 1420 | Зарегистр. 25-10-2006 | Отправлено: 10:07 14-11-2008
    Mister_Che

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

    Цитата:
    У меня все работает. Пауза повешена на клавишу p (з) На клавише "Pause/Break" у меня Punto Switcher сидит, потому ее не использовал.

     
    Сменил на {PAUSE}, не выходит. Терминэйт работает.
     
     

    Цитата:
     
     Global $Paused
    HotKeySet("{ESC}", "Terminate")
    HotKeySet("{PAUSE}", "TogglePause")  
     
    while 1
     
    не имеющий значения код с кликами и слипами
     
    WEnd
     
      Func Terminate()
        Exit 0
    EndFunc
     
    Func TogglePause()
        $Paused = NOT $Paused
    EndFunc

    Всего записей: 353 | Зарегистр. 05-02-2006 | Отправлено: 10:38 14-11-2008
    ViSiToR



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Maza_Faka
    Забавно как мы почти одинаково мыслим, я тут вот что наваял, и тоже не люблю такие методы (кстати, в этих примерах тултип начинает "плыть" если в списке больше 3-4 строк )...
     

    Код:
    #include <GuiConstantsEx.au3>
    #include <ComboConstants.au3>
    #include <WindowsConstants.au3>
    #include <GuiComboBoxEx.au3>
     
    Global $iComboIsOpen = False
     
    $hGUI = GUICreate("Test GUI", 200, 100)
     
    $CtlCombo = GUICtrlCreateCombo("Long Long Long Long Long Item 1", 50, 30, 100, 20)
    GUICtrlSetData(-1, "Long Long Long Long Long Item 2|Long Long Long Long Long Item 3")
     
    $OkButton = GUICtrlCreateButton("Ok", 11, 169, 75, 23)
     
    $CloseButton = GUICtrlCreateButton("Close", 215, 169, 75, 23)
     
    $hTimer = DllCall("user32.dll", "int", "SetTimer", "hwnd", $hGUI, "int", 1001, "int", 10, "ptr", 0)
     
    GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
    GUIRegisterMsg($WM_TIMER, "WM_TIMER")
     
    GUISetState()
     
    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                DllCall("user32.dll", "int", "KillTimer", "hwnd", $hGUI, "int", 1001)
                Exit
            Case
    $OkButton
                MsgBox(0, "", GUICtrlRead($CtlCombo))
        EndSwitch
    WEnd
     
    Func
    WM_TIMER($hWnd, $nMsg, $wParam, $lParam)
        If Not $iComboIsOpen Then Return $GUI_RUNDEFMSG
     
        Local $sHovered_ClassName = _WinGetHoveredClassName()
     
        If $sHovered_ClassName <> "ComboLBox" Then
            If
    $sHovered_ClassName <> "tooltips_class32" Then ToolTip("")
            Return $GUI_RUNDEFMSG
        EndIf
     
        Local
    $iItemHeight = _GUICtrlComboBoxEx_GetItemHeight($CtlCombo)
     
        Local $sRead_Combo = GUICtrlRead($CtlCombo)
        Local $aPos = WinGetPos(GUICtrlGetHandle($CtlCombo))
        Local $iY = (GUICtrlSendMsg($CtlCombo, $CB_GETCURSEL, 0, 0) + 1) * $iItemHeight + 3
     
        ToolTip($sRead_Combo, $aPos[0], $aPos[1] + $iY)
    EndFunc
     
    Func
    WM_COMMAND($hWnd, $nMsg, $wParam, $lParam)
        Local $iIDFrom = BitAND($wParam, 0x0000FFFF)
        Local $iCode = BitShift($wParam, 16)
     
        Switch $iIDFrom
            Case $CtlCombo
                Switch $iCode
                    Case $CBN_DROPDOWN
                        $iComboIsOpen
    = True
                    Case
    $CBN_CLOSEUP
                        $iComboIsOpen
    = False
                        ToolTip("")
                EndSwitch
        EndSwitch
     
        Return $GUI_RUNDEFMSG
    EndFunc
     
    Func _WinGetHoveredClassName()
        Local $iOld_Opt_MCM = Opt("MouseCoordMode", 1)
        Local $aWFP = DllCall("user32.dll", "int", "WindowFromPoint", "long", MouseGetPos(0), "long", MouseGetPos(1))
        Opt("MouseCoordMode", $iOld_Opt_MCM)
     
        Local $aClassName = DLLCall("user32.dll", "int", "GetClassName", "hWnd", HWnd($aWFP[0]), "str", "", "int", 256)
        If Not @error And $aClassName[0] <> 0 Then Return $aClassName[2]
     
        Return @error
    EndFunc

     
    Но у меня в примере тултип исчезает если под курсором не список Combo

    ----------
    ViSiToR a.k.a CreatoR
    CreatoR это не ник, CreatoR это стиль жизни!

    Всего записей: 3251 | Зарегистр. 01-04-2006 | Отправлено: 10:42 14-11-2008
    gal7

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Большое спасибо, Maza_Faka, заодно я разобрался с использованием DllCallbackRegister(), буду знать. Буду прикручивать к своему скрипту.

    Цитата:
    Честно говоря, вся эта идея попахивает извратом, ну не любитель я таких трюков  

    Да, сложновато, но для моих целей самое то.  
     
    Добавлено:
    Пока разбирался, появился еще пример Благодарю, ребята

    Всего записей: 145 | Зарегистр. 03-06-2007 | Отправлено: 10:53 14-11-2008
    lex83_2002

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    XML DOM Wrapper
     
    Func _XMLGetField($strXPath)
        If not IsObj($objDoc) then
            _XMLError("No object passed to function _XMLGetField")
            Return SetError(1,2,-1)
        EndIf
        Local $objNodeList, $arrResponse[1], $xmlerr, $szNodePath
            $objNodeList = $objDoc.selectSingleNode ($strXPath)
            If Not IsObj($objNodeList) Then
                _XMLError("\nNo Matching Nodes found")
                $arrResponse[0] = 0
                Return SetError(2,0,-1)
            EndIf
            If $objNodeList.hasChildNodes () Then
                Local $count = $objNodeList.childNodes.length
                For $x =1 to $count
                    $objChild = $objNodeList.childNodes($x)
                        _DebugWrite("ParentNode="&$objNodeList.parentNode.nodeType)
                        If $objNodeList.parentNode.nodeType =$NODE_DOCUMENT Then
                            $szNodePath="/"&$objNodeList.baseName &"/*["&$x&"]"
                        Else
                            $szNodePath = $objNodeList.baseName &"/*["&$x&"]"
                        EndIf
                        
                        $aRet = _XMLGetValue($szNodePath)
                        If IsArray($aRet) Then
                            If UBound($aRet) > 1 Then
                                _XMLArrayAdd($arrResponse, $aRet[1])
                                _DebugWrite("GetField>Text:" & $aRet[1])
                            EndIf
                        Else
                            _XMLArrayAdd($arrResponse, "")
                            _DebugWrite("GetField>Text:" & "")
                        EndIf
                Next
                $arrResponse[0] = UBound($arrResponse) - 1
                Return $arrResponse
            Else
                $arrResponse[0] = 0
                _XMLError("\nNo Child Nodes found")
                Return SetError(1,0,-1)
            EndIf
            _XMLError("Error Selecting Node(s): " & $strXPath & $xmlerr)
        Return SetError(1,0,-1)
    EndFunc   ;==>_XMLGetField
     
    Кто  подскажет, а как сюда саму xml-то передать ?

    Всего записей: 6 | Зарегистр. 05-11-2007 | Отправлено: 12:02 14-11-2008 | Исправлено: lex83_2002, 12:04 14-11-2008
    Tipulatoid



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

    Цитата:
    Сменил на {PAUSE}, не выходит.  Терминэйт работает.

    Ты не только сменил клавишу. Ты еще зачем-то из моего примера убрал из функции TogglePause() цикл While, который паузу и делает.

    Код:
    Global $Paused
    HotKeySet("{ESC}", "Terminate")
    HotKeySet("{PAUSE}", "TogglePause")
     
    While 1
          ConsoleWrite ("Скрипт работает" & @CRLF)
    ;     не имеющий значения код с кликами и слипами
    WEnd
     
    Func Terminate()
        Exit 0
    EndFunc
     
    Func TogglePause()
        $Paused = NOT $Paused
        ConsoleWrite ("Скрипт приостановлен" & @CRLF)
        While $Paused
           Sleep (50)
        WEnd
    EndFunc

    Всего записей: 349 | Зарегистр. 22-12-2006 | Отправлено: 12:29 14-11-2008 | Исправлено: Tipulatoid, 17:17 14-11-2008
    ViSiToR



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Tipulatoid 12:29 14-11-2008
    Цитата:
    Если же беспокоит, что цикл  While $Paused ... WEnd слишком грузит процессор, то добавь внутрь его Sleep (50)

    А тебя не беспокоит? Это портит (физический) процессор. В примере где есть подобный цикл, лучше сразу сам ставь паузу, чтобы дать другим пример как надо делать

    ----------
    ViSiToR a.k.a CreatoR
    CreatoR это не ник, CreatoR это стиль жизни!

    Всего записей: 3251 | Зарегистр. 01-04-2006 | Отправлено: 15:35 14-11-2008
    Inquisition

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

    Код:
     
    WinActivate("Тра ляляля")                                              ;Activate window and wait till it's opened.
    WinWaitActive("Тра ляляля")                                            
    Opt("MouseCoordMode", 0)                                                                          ;1=absolute, 0=relative, 2=client
    Opt("PixelCoordMode", 0)                                                                          ;1=absolute, 0=relative, 2=client
    Dim $Runner                                                                                                       ;Declare variable
    Dim $array[5] = ["","414,223","471,233","528,220","470,204"]                              ;Mouse positions for moving to random map
    HotKeySet("{ESC}", "Terminate")                                                                                             ;On/Off
    HotKeySet("{F9}", "ShowMe")
    While 1                                                                                ;If F9 is clicked then enitiate Func Start()
        Sleep(20)
        If $Runner Then Start()
    WEnd
    Func ShowMe()                                                                                                           ;Look above
        $Runner = Not $Runner
    EndFunc                                                                                                                  ;==>ShowMe
    Func Terminate()                                                                                ;If Esc is clicked then stop script
        Exit 0
    EndFunc  
     
     
    Func CombatCheck()
        sleep(3000)
        $CombatCheck = PixelSearch(352, 365, 353, 366, 0x7AB800, 1)
        If IsArray($CombatCheck) Then
        MouseClick('Left', 381, 426)
        sleep(1000)
        mouseclick("left", 511, 455)
        sleep(300)
        mouseclick("left", 511, 441)  
        sleep(300)
        mouseclick("left", 511, 408)  
        sleep(10000)
        start()
        
        
     
    Func Start()                                                                                                          ;The main bot
        $coord = PixelSearch(129, 261, 858, 490, 0xfa6541)                                                            ;Look for monster
        If IsArray($coord) Then
            MouseClick('Left', $coord[0], $coord[1] - 1)                                         ;If monster found, click on its coords
        EndIf
        If Not IsArray($coord) Then                                                           ;If monster not found, move to random map
        $random = Random(1, 4, 1)
        $Split = StringSplit($array[$random], ",")
        MouseClick("Left", $Split[1], $Split[2])
    Start()                                                                                    ;Restart the script and look for monster
    EndIf
     
     
     
    mouseclick("left", 289, 230)                                                                                          ;START combat
    sleep(1000)
    $FightCheck = PixelSearch(309, 250, 310, 251, 0x0054e3, 2)   ;If combat with that monster already started, leave and restart script
    If IsArray($FightCheck) Then
            MouseClick('Left', 525, 520)
    Start()
        EndIf
    CombatCheck()
     
     
    Do                                                      ;Combat script | Search for attack button, click it, move on to next attack
        sleep(100)
        $Bottom1 = PixelSearch(352, 456, 353, 457, 0x68181b, 3)
    until IsArray($Bottom1)
    If IsArray($Bottom1) Then
            MouseClick('Left', $Bottom1[0], $Bottom1[1] - 1)          
        EndIf
    CombatCheck()
     
    Do
        sleep(100)
        $Upper1 = PixelSearch(328, 377, 329, 378, 0x68181b, 12)
    until isArray($Upper1)
    If IsArray($Upper1) Then
            MouseClick('Left', $Upper1[0], $Upper1[1] - 1)          
        EndIf
    CombatCheck()
     
     
        
    Do
        sleep(100)
        $Upper11 = PixelSearch(328, 377, 329, 378, 0x68181b, 12)
    until IsArray($Upper11)
    If IsArray($Upper11) Then
            MouseClick('Left', $Upper11[0], $Upper11[1] - 1)          
        EndIf
    CombatCheck()
     
        
    Do
        sleep(100)
        $Middle1 = PixelSearch(357, 429, 358, 430, 0x731111, 15)
    until IsArray($Middle1)
    If IsArray($Middle1) Then
            MouseClick('Left', $Middle1[0], $Middle1[1] - 1)          
        EndIf                                                                      
    CombatCheck()
     
        
    Do
        sleep(100)
        $Bottom2 = PixelSearch(352, 456, 353, 457, 0x68181b, 3)
    until IsArray($Bottom2)
    If IsArray($Bottom2) Then
            MouseClick('Left', $Bottom2[0], $Bottom2[1] - 1)          
        EndIf                                                                    
    CombatCheck()
     
        
    Do
        sleep(100)
        $Upper2 = PixelSearch(328, 377, 329, 378, 0x68181b, 12)
    until IsArray($Upper2)
    If IsArray($Upper2) Then
            MouseClick('Left', $Upper2[0], $Upper2[1] - 1)          
    EndIf
    CombatCheck()
     
        
    Do
        sleep(100)
        $Upper22 = PixelSearch(328, 377, 329, 378, 0x68181b, 12)
    until IsArray($Upper22)
    If IsArray($Upper22) Then
            MouseClick('Left', $Upper22[0], $Upper22[1] - 1)          
    EndIf
    CombatCheck()
     
        
    Do
        sleep(100)
         $Middle2 = PixelSearch(357, 429, 358, 430, 0x731111, 15)
    until IsArray($Middle2)
    If IsArray($Middle2) Then
            MouseClick('Left', $Middle2[0], $Middle2[1] - 15)        
        EndIf
    CombatCheck()
        
        
    Do
        sleep(100)
        $Middle3 = PixelSearch(357, 429, 358, 430, 0x731111, 15)
    until IsArray($Middle3)
    If IsArray($Middle3) Then
            MouseClick('Left', $Middle3[0], $Middle3[1] - 1)          
        EndIf
    CombatCheck()
     
        
        Do
        sleep(100)
        $Middle4 = PixelSearch(357, 429, 358, 430, 0x731111, 15)
    until IsArray($Middle4)
    If IsArray($Middle4) Then
            MouseClick('Left', $Middle4[0], $Middle4[1] - 1)          
        EndIf
    CombatCheck()
     
        
        Do
        sleep(100)
        $Middle5 = PixelSearch(357, 429, 358, 430, 0x731111, 15)
    until IsArray($Middle5)
    If IsArray($Middle5) Then
            MouseClick('Left', $Middle5[0], $Middle5[1] - 1)          
        EndIf      
    CombatCheck()    
        
        
    EndFunc                                                                                                                     ;Repeat
     

    Здравствуйте. У меня глюк на форуме autoitscript.com и я там не могу создавать темы. Приведенный выше скрипт полностью работает за исключением функции CombatCheck()
    Вобще функция работает, если её отдельно от остального скрипта запустить все замечательно, но в самом скрипте она не запускается. Я более 4 часов пытался эту функцию запустить, пробовал и уберать pixeldetect заменя на MsgBox() также пробовал саму функцию вручную прописывать в нужных местах, пробовал делать loop через $a=$a+1 все без толку. Скажите пожалуйсто почему функция не запускается, а то я сума сойду!!

    Всего записей: 10 | Зарегистр. 14-11-2008 | Отправлено: 18:27 14-11-2008 | Исправлено: Inquisition, 19:19 14-11-2008
    ViSiToR



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Inquisition 18:27 14-11-2008
    Цитата:
     Приведенный выше скрипт полностью работает за исключением функции CombatCheck()

    Поскольку вызов этой функции происходит довольно часто, можно сказать что скрипт вовсе не работает, тем более что проверка синтаксиса выдаёт кучу ошибок.
    Вопросы по работе скрипта следовало бы задавать тому, кто его писал (или собирал по кускам ).

    ----------
    ViSiToR a.k.a CreatoR
    CreatoR это не ник, CreatoR это стиль жизни!

    Всего записей: 3251 | Зарегистр. 01-04-2006 | Отправлено: 20:13 14-11-2008
    Inquisition

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Писал этот скрипт я полностью сам, можете даже посмотреть на форуме autoitscript я под тем же ником там (Просто щас глюк и выдает ошибку на форуме). Все эти ошибки синтакса реально не ошибки, для autoit не важно пишешь ты 'left' или "LEFT" или "lEfT' проверял я сам. Как я уже говорил если эту функцию убрать и вместо CombatCheck() везде писать $CombatCheck1,2,3, и.т.д. тоже не работает.
     
    З.Ы. скрипт полностью работает, т.е. он выполняет все действия от начала до конца кроме CombatCheck()
     
    З.З.Ы. F:\Autoit Scripts\ПАМИДОР\АГУРЕЦ.au3 - 0 error(s), 0 warning(s)
     
    З.З.З.Ы. В скрипте написанным мною выше нету EndFunc и EndIf в функции, это потому-что у меня около 10 вариаций этого скрипта, в каждой из которых функция CombatCheck() не работает. Вот я собрал из этих 10 самую стабильную чтобы выложить на форум и забыл добавить EndFunc и EndIf, как бы то небыло это не влияет на скрипт, всеравно не работает CombatCheck()

    Всего записей: 10 | Зарегистр. 14-11-2008 | Отправлено: 21:10 14-11-2008 | Исправлено: Inquisition, 21:24 14-11-2008
    Mister_Che

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Tipulatoid
    Объясни, пожалуйста, что написал этот человек?

    Цитата:
    А тебя не беспокоит? [Image] Это портит (физический) процессор. В примере где есть подобный цикл, лучше сразу сам ставь паузу, чтобы дать другим пример как надо делать

     
    Твой код заработал, спасибо, большое.

    Цитата:
    Ты еще зачем-то из моего примера убрал из функции TogglePause() цикл While, который паузу и делает.  

    Там была такая строка: "ConsoleWrite", а ведь если кем-то было записано, то оно когда-нибудь будет и прочитано, а мне излишнее внимание не нужно.

    Всего записей: 353 | Зарегистр. 05-02-2006 | Отправлено: 21:26 14-11-2008 | Исправлено: Mister_Che, 21:27 14-11-2008
    ViSiToR



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Inquisition 21:10 14-11-2008
    Цитата:
    Все эти ошибки синтакса реально не ошибки, для autoit не важно пишешь ты 'left' или "LEFT" или "lEfT' проверял я сам.

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

    Цитата:
    как бы то небыло это не влияет на скрипт, всеравно не работает CombatCheck()

    Но это влияет на то, захочет ли народ помагать тебе, и пытаться включить экстрасенсорные способности дабы узнать, что-же такого не хватает в скрипте. Я лично не могу (да и не хочу) найти ошибку скриптового характера, когда есть ещё и базовые ошибки синтаксиса.
     
    Mister_Che 21:26 14-11-2008
    Цитата:
    что написал этот человек?

    Он ещё тут, вроде ещё не умер, можно и у него спросить  
    Я написал про то, что если уже выкладывать скрипт с примером, то делать его максимально “дружелюбным” к пользователю (другими словами, нужно всегда ставить Sleep(10) в “пустой” цикл).

    ----------
    ViSiToR a.k.a CreatoR
    CreatoR это не ник, CreatoR это стиль жизни!

    Всего записей: 3251 | Зарегистр. 01-04-2006 | Отправлено: 21:39 14-11-2008
    Inquisition

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Извиняюсь, я просто очень очень много время бился над этой функцией без результата. Уже мозг не работает так как надо.
     

    Код:
     
    WinActivate("Легенда: Наследие Драконов")                                              ;Activate window and wait till it's opened.
    WinWaitActive("Легенда: Наследие Драконов")                                            
    Opt("MouseCoordMode", 0)                                                                          ;1=absolute, 0=relative, 2=client
    Opt("PixelCoordMode", 0)                                                                          ;1=absolute, 0=relative, 2=client
    Dim $Runner                                                                                                       ;Declare variable
    Dim $Array[5] = ["","414,223","471,233","528,220","470,204"]                              ;Mouse positions for moving to random map
    HotKeySet("{ESC}", "Terminate")                                                                                             ;On/Off
    HotKeySet("{F9}", "ShowMe")
    While 1                                                                                ;If F9 is clicked then enitiate Func Start()
        Sleep(20)
        If $Runner Then Start()
    WEnd
    Func ShowMe()                                                                                                           ;Look above
        $Runner = Not $Runner
    EndFunc                                                                                                                  ;==>ShowMe
    Func Terminate()                                                                                ;If Esc is clicked then stop script
        Exit 0
    EndFunc  
     
     
    Func CombatCheck()
        Sleep(3000)
        $CombatCheck = PixelSearch(352, 365, 353, 366, 0x7AB800, 1)
        If IsArray($CombatCheck) Then
        MouseClick("Left", 381, 426)
        Sleep(1000)
        mouseclick("left", 511, 455)
        Sleep(300)
        mouseclick("left", 511, 441)  
        Sleep(300)
        mouseclick("left", 511, 408)  
        Sleep(10000)
        Start()
        EndIf
    EndFunc
        
        
     
    Func Start()                                                                                                          ;The main bot
        $Coord = PixelSearch(129, 261, 858, 490, 0xfa6541)                                                            ;Look for monster
        If IsArray($Coord) Then
            MouseClick("Left", $Coord[0], $Coord[1] - 1)                                         ;If monster found, click on its coords
        EndIf
        If Not IsArray($Coord) Then                                                           ;If monster not found, move to random map
        $Random = Random(1, 4, 1)
        $Split = StringSplit($Array[$Random], ",")
        MouseClick("Left", $Split[1], $Split[2])
    Start()                                                                                    ;Restart the script and look for monster
    EndIf
     
     
     
    MouseClick("Left", 289, 230)                                                                                          ;START combat
    Sleep(1000)
    $FightCheck = PixelSearch(309, 250, 310, 251, 0x0054e3, 2)   ;If combat with that monster already started, leave and restart script
    If IsArray($FightCheck) Then
            MouseClick("Left", 525, 520)
    Start()
        EndIf
    CombatCheck()
     
     
    Do                                                      ;Combat script | Search for attack button, click it, move on to next attack
        Sleep(100)
        $Bottom1 = PixelSearch(352, 456, 353, 457, 0x68181b, 3)
    Until IsArray($Bottom1)
    If IsArray($Bottom1) Then
            MouseClick("Left", $Bottom1[0], $Bottom1[1] - 1)          
        EndIf
    CombatCheck()
     
    Do
        Sleep(100)
        $Upper1 = PixelSearch(328, 377, 329, 378, 0x68181b, 12)
    Until IsArray($Upper1)
    If IsArray($Upper1) Then
            MouseClick("Left", $Upper1[0], $Upper1[1] - 1)          
        EndIf
    CombatCheck()
     
     
        
    Do
        Sleep(100)
        $Upper11 = PixelSearch(328, 377, 329, 378, 0x68181b, 12)
    Until IsArray($Upper11)
    If IsArray($Upper11) Then
            MouseClick("Left", $Upper11[0], $Upper11[1] - 1)          
        EndIf
    CombatCheck()
     
        
    Do
        Sleep(100)
        $Middle1 = PixelSearch(357, 429, 358, 430, 0x731111, 15)
    Until IsArray($Middle1)
    If IsArray($Middle1) Then
            MouseClick("Left", $Middle1[0], $Middle1[1] - 1)          
        EndIf                                                                      
    CombatCheck()
    EndFunc
     

     
    Вот урезаная версия кода, я отрезал последнюю часть которая является просто длинным продолжением поиска и клика пикселей которая тут не причем. Так, что же тут не так с функцией CombatCheck()

    Всего записей: 10 | Зарегистр. 14-11-2008 | Отправлено: 21:54 14-11-2008
    Mister_Che

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

    Цитата:
     Global $Paused
    HotKeySet("{ESC}", "Terminate")
    HotKeySet("{PAUSE}", "TogglePause")
     
    While 1
          ConsoleWrite ("Скрипт работает" & @CRLF)
    ;     не имеющий значения код с кликами и слипами
    WEnd
     
    Func Terminate()
        Exit 0
    EndFunc
     
    Func TogglePause()
        $Paused = NOT $Paused
        ConsoleWrite ("Скрипт приостановлен" & @CRLF)
        While $Paused
           Sleep (50)
        WEnd
    EndFunc

    пустой цикл выполняется только во время паузы? А что будет, если поставить в этом пустом цикле Sleep на минуту, скажем?
     
    И можно ли убрать строки с ConsoleWrite без потери функциональности?

    Всего записей: 353 | Зарегистр. 05-02-2006 | Отправлено: 22:19 14-11-2008 | Исправлено: Mister_Che, 22:21 14-11-2008
    Inquisition

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Mister_Che  
     
    Можешь использовать функции ShowMe и Terminate из моего скрипта, предварительно заменив Exit на Паузу. Тогда при нажатии esc скрипт будет в паузе а при нажатии f9 будет работать.

    Всего записей: 10 | Зарегистр. 14-11-2008 | Отправлено: 22:29 14-11-2008
       

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

    Компьютерный форум Ru.Board » Компьютеры » Программы » AutoIT (Часть 1)
    Widok (12-01-2009 14:47): лимит страниц. продолжаем здесь


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

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.Board
    © Ru.Board 2000-2020

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru