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

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



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

    Цитата:
    с подстановкой @ComputerName заработало

    В RegRead не нужен конечный слеш:
     

    Код:
    Global $file=RegRead("HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\ComputerName", "ComputerName")

     
    Хотя у меня этого ключа вовсе нет.

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

    Всего записей: 3251 | Зарегистр. 01-04-2006 | Отправлено: 19:54 09-04-2008
    Astra55



    Platinum Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Суть проблемы - имеются портабельные софты, сделанные с помощью Thinstall. При переносе на разные компы необходим ввод регистрационных данных, поскольку софты вяжутся к железу. Была попытка сделать скрипт AutoIt следующим образом:
    FileInstall("XXX.exe", @TempDir&"\XXX.exe")  
    Opt("TrayIconHide", 1)  
    Run(@TempDir&"\XXX.exe")  
    if WinWait ( "YYY", "", 4) Then  
        ControlClick("YYY", "", "Button1")  
    EndIf      
         
    if WinWait ( "ZZZ", "", 4) then; 4 sec  
        ControlSetText("ZZZ", "", "Edit1", "12345" )  
        ControlClick("Yes", "", "Button1")  
        if WinWait ( "Yes", "OK", 4) then; 4 sec  
         ControlClick("Yes", "OK", "Button1")  
         EndIf  
    EndIf      
    ; end script  
    Все хорошо, но сам софт запускается из папки Temp, а нужно чтобы запускался из виртуального контейнера Thinstall, иначе в памяти работают два одинаковых экзешника.
    Можно ли заставить запуститься только виртуальный экзешник, чтобы скрипт AutoIt провел регистрацию и больше не реагировал на любые окна софта? Проблема достаточно актуальная, поскольку софтов с привязкой к железу тем же ASProtect-ом хватает. Можно все это делать вручную, но желательно на автомате и в виде единого exe файла.

    ----------
    Per warez ad scientiam

    Всего записей: 11717 | Зарегистр. 16-05-2003 | Отправлено: 20:36 09-04-2008
    ynbIpb



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    А можно по подробнее, что за софт?
    Я вообще удивлюсь, что программы накрытые протом запускаются в Thinstall'e
    Наилучшим вариантом было бы - снять полностью прот, но если нет, то я вижу это так:
    в тхинстал пакуется скрипт, который будет основным запускаемым файлом программы. Он при запуске уже сам запускает экзе программы и  каким либо образом должен определять, что это первый запуск на новой машине или просто ожидать окна запроса ключа. и если окно появляется запускать опять же кейген и генерить,вводить нужные данные. Но чтоб подробнее вникнуть надо взглянуть на софт.

    Всего записей: 1619 | Зарегистр. 01-05-2006 | Отправлено: 22:17 09-04-2008
    Astra55



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

    Цитата:
    А можно по подробнее, что за софт?  

    BoilSoft Video Splitter 5.01 - http://forum.ru-board.com/topic.cgi?forum=35&topic=12324&start=120#lt

    Цитата:
    Я вообще удивлюсь, что программы накрытые протом запускаются в Thinstall'e  

    Пока не сталкивался с проблемами такого плана, все запускается нормально.

    Цитата:
    снять полностью прот

    Не получается Тогда мне не нужен никакой скрипт, поскольку регистрация будет открыто лежать в реестре.
    Мне по сути нужно только один раз запустить скриптом Thinstall-енный экзешник, не распаковывая его в какую-либо папку и зарегистрировать. Потом скрипт вообще не нужен. Отдельным скриптом в экзешном виде это делается элементарно. При запуске портабельной программы, если выбрать в ней Open file, то софт видит свою собссную папку в реальной директории Program Files, видно все файлы,  но друг друга два софта уже не видят. Похоже, что шансов сделать такое извращение, как мне нужно, почти нет.


    ----------
    Per warez ad scientiam

    Всего записей: 11717 | Зарегистр. 16-05-2003 | Отправлено: 07:38 10-04-2008
    ynbIpb



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Скачал, глянул. анализатор показывает ASProtect 2.3 SKE
    Представляю себе так:
    делаем основным экзешником программы скрипт типа loader.exe
    он запускает программу, делает проверку на наличие текста в заголовке окна о триале. и если этого нет завершается скрипт, если есть нажимает на кнопку вводит данные.
    Вот специально намутил...

    Код:
    AutoItSetOption ( "TrayIconHide", 1 )
    If WinExists(@ScriptName) Then Exit
    AutoItWinSetTitle(@ScriptName)
    ;--------------------------------------
    Run(@ScriptDir & "\VideoSplitter.exe")
    WinWaitActive("Boilsoft Video Splitter v5.01","www.boilsoft.com",5)
    If WinExists ("Boilsoft Video Splitter v5.01 - Trial Version") Then
    ControlClick("Boilsoft Video Splitter v5.01", "", "[CLASS:Button; CLASSNN:Button10]")
    WinWaitActive("Registration","Name:",5)
    ControlSend ( "Registration","Name:", "[CLASS:Edit; CLASSNN:Edit1]", "Имя хозяина ключа")
    ControlSend ( "Registration","Name:", "[CLASS:Edit; CLASSNN:Edit2]", "XXXX-XXXXX-XXXXX-XXXXX-XXXXX-XXXXX-XXXXX-XXXXX-XXXXX")
    ControlClick("Registration","Name:","OK")
    EndIf

    зы
    Себе собрал портабл. Работает как положено. Первый запуск сразу вводит, второй запуск молчит. рег инфо в песочнице.
     
    ----------------------------
    з.ы.ы.
    Поэкспериментировав, пришёл к выводу время ожидания окна надо увеличить до 20 секунд, так как при первом запуске пакованый аспром файл долго запускается видимо из-за проверки антивирем.  Остальное в ПМ ибо отклоняемся от темы.

    Всего записей: 1619 | Зарегистр. 01-05-2006 | Отправлено: 10:06 10-04-2008 | Исправлено: ynbIpb, 14:39 10-04-2008
    Astra55



    Platinum Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Дык с  отдельным экзешным лодырем все работало до этого. Как замутить это все в ОДНОМ экзешнике, вот в чем вопрос! Или я что-то не понял в идее?

    ----------
    Per warez ad scientiam

    Всего записей: 11717 | Зарегистр. 16-05-2003 | Отправлено: 11:34 10-04-2008
    gregaz



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Просьба ответить на пару вопросов :
     
    1. Как организовать поиск иконки , соответствующей типу файла ?
    2. Как остановить выполнение проверки условия  Switch-Case (аналогичный ExitLoop для цмкла )?

    Всего записей: 79 | Зарегистр. 02-06-2007 | Отправлено: 20:08 11-04-2008 | Исправлено: gregaz, 20:10 11-04-2008
    ViSiToR



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

    Цитата:
    Как организовать поиск иконки , соответствующей типу файла ?

    Вот функция для получения иконки, идентификатора, и описания для типа файла:
     

    Код:
    #include <GUIConstants.au3>
     
    $FileFolderFullPath = "c:\Boot.ini"
     
    GUICreate("Get File/Folder Type & Icon", 300, 150)
     
    $aIconInfo = _FileGetIcon($FileFolderFullPath)
    $sIconType = _FileGetType($FileFolderFullPath)
     
    GUICtrlCreateButton("", 130, 50, 36, 36, $BS_ICON)
    GUICtrlSetImage(-1, $aIconInfo[1], -($aIconInfo[2]-1))
     
    GUICtrlCreateLabel($sIconType, 0, 90, 300, 20, $ES_CENTER)
     
    GUISetState()
     
    While GUIGetMsg() <> -3
    WEnd
     
    Func
    _FileGetType($sFilePathOrExt)
        Local $iOld_Opt_EES = Opt("ExpandEnvStrings", 1)
        Local $sRegDefault, $sRegType="", $sExt
     
        If _IsFolder($sFilePathOrExt) Then
            $sRegDefault = RegRead("HKCR\Folder", "")
            If $sRegDefault <> "" Then $sRegType = $sRegDefault
        Else
            $sExt = StringRegExpReplace($sFilePathOrExt, '^.*\.', '.')
            If $sExt = $sFilePathOrExt Then
                $sExtSaerch = FileFindFirstFile($sFilePathOrExt & ".*")
                $sExt = StringRegExpReplace(FileFindNextFile($sExtSaerch), '^.*\.', '.')
                $sFilePathOrExt &= $sExt
            EndIf
     
            $sRegDefault = RegRead("HKCR\" & $sExt, "")
     
            If $sRegDefault <> "" Then $sRegType = RegRead("HKCR\" & $sRegDefault, "")
            If $sRegType = "" Then $sRegType = $sExt & "-File"
        EndIf
     
        Opt("ExpandEnvStrings", $iOld_Opt_EES)
     
        Return $sRegType
    EndFunc
     
    Func
    _FileGetIcon($sFile)
        Local $iOld_Opt_EES = Opt("ExpandEnvStrings", 1)
        Local $sRegDefault = "", $sDefIcon = "", $sExt, $sIconFile, $nIcon=0
        Local $aRet[3], $iError = 0
     
        If _IsFolder($sFile) Then
            $sRegDefault = RegRead("HKCR\Folder", "")
            If $sRegDefault <> "" Then $sDefIcon = RegRead("HKCR\Folder\DefaultIcon", "")
        Else
            $sExt = StringRegExpReplace($sFile, '^.*\.', '.')
     
            If $sExt = ".lnk" Then
                Local
    $aLinkInfo = FileGetShortcut($sFile)
     
                If Not @error Then
                    Opt("ExpandEnvStrings", $iOld_Opt_EES)
     
                    Dim $aRet[3] = [2, $aLinkInfo[4], $aLinkInfo[5]]
                    Return $aRet
                EndIf
            EndIf
     
            If
    $sExt = $sFile Then
                $sExt = FileFindFirstFile($sFile & ".*")
                $sExt = StringRegExpReplace(FileFindNextFile($sExt), '^.*\.', '.')
                $sFile &= $sExt
            EndIf
     
            $sRegDefault = RegRead("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\" & $sExt, "ProgID")
     
            If $sRegDefault = "" Then $sRegDefault = RegRead("HKCR\" & $sExt, "")
            If $sRegDefault <> "" Then $sDefIcon = RegRead("HKCR\" & $sRegDefault & "\DefaultIcon", "")
        EndIf
     
        If
    $sDefIcon = "" Then
            $sIconFile = "shell32.dll"
        ElseIf $sDefIcon <> "%1" Then
            If
    StringRegExpReplace($sFile, "^.*\\", "") = "shell32.dll" Then
                $sIconFile = $sFile
                $nIcon
    = 0
            Else
                Local
    $aDefIconSplit = StringSplit($sDefIcon, ",")
     
                If IsArray($aDefIconSplit) Then
                    $sIconFile = $aDefIconSplit[1]
                    If $aDefIconSplit[0] > 1 Then $nIcon = $aDefIconSplit[2]
                Else
                    $iError = 1
                EndIf
            EndIf
        ElseIf
    $sDefIcon = "%1" Then
            $sIconFile = $sFile
            $nIcon
    = 0
        EndIf
     
        Opt("ExpandEnvStrings", $iOld_Opt_EES)
     
        Dim $aRet[3] = [2, $sIconFile, $nIcon]
     
        Return SetError($iError, 0, $aRet)
    EndFunc
     
    Func
    _IsFolder($sPath)
        Return StringInStr(FileGetAttrib($sPath), "D")
    EndFunc

     

    Цитата:
    Как остановить выполнение проверки условия  Switch-Case

    А зачем останавливать? в этой проверке только одно условие будет выполнено

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

    Всего записей: 3251 | Зарегистр. 01-04-2006 | Отправлено: 03:16 12-04-2008
    gregaz



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

    Цитата:
    Вот функция для получения иконки, идентификатора, и описания для типа файла:

     
    Спасибо Но эта функция работает достаточно медленно  (я ей пользовался).
    Кстати при попытке вставить некоторые найденные ей иконки в ImageList выдается системное Error : _GUIImageList_AddIcon : -1 и скрипт выгружается ?
    Видимо данному типу файла соответствует несколько иконок
    Как предотвратить выгрузку скрипта ?
     

    Цитата:
    А зачем останавливать? в этой проверке только одно условие будет выполнено  

     
    Вот пример :
     Здесь хотелось бы вместо If-Else-EndIf иметь что-то типа  :  
    If $a=0 Then CaseExit (несуществующнее)
    Я устанавливаю холостой Case $bt2 и ставлю ContinueCase

    Код:
     
    While 1
      $msg = GUIGetMsg()    
      Switch $msg    
          Case $bt1
               $a=Func1
               If $a=0 Then  
               else  
                   .........
                   .........
               EndIf
               $b=Func2
               $c=Func3
         Case $bt2
    EndSwitch    
    WEnd    
     


    Всего записей: 79 | Зарегистр. 02-06-2007 | Отправлено: 08:11 12-04-2008 | Исправлено: gregaz, 08:24 12-04-2008
    ViSiToR



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

    Цитата:
    эта функция работает достаточно медленно  

    Это из за Opt("ExpandEnvStrings", 1). Можно попробовать расширять переменные отдельной функцией (или вообще не использовать расширение, если не критично):
     

    Код:
    Func _FileGetIcon($sFile)
        Local $sRegDefault = "", $sDefIcon = "", $sExt, $hSearch, $sIconFile, $nIcon=0
        Local $aRet[3], $iError = 0
     
        If _IsFolder($sFile) Then
            $sRegDefault = RegRead("HKCR\Folder", "")
            If $sRegDefault <> "" Then $sDefIcon = RegRead("HKCR\Folder\DefaultIcon", "")
        Else
            $sExt = StringRegExpReplace($sFile, '^.*\.', '.')
     
            If $sExt = ".lnk" Then
                Local
    $aLinkInfo = FileGetShortcut($sFile)
     
                If Not @error Then
                    Dim
    $aRet[3] = [2, _Expand_Environments($aLinkInfo[4]), $aLinkInfo[5]]
                    Return $aRet
                EndIf
            EndIf
     
            If
    $sExt = $sFile Then
                $hSearch = FileFindFirstFile($sFile & ".*")
                $sExt = StringRegExpReplace(FileFindNextFile($hSearch), '^.*\.', '.')
                $sFile &= $sExt
                FileClose($hSearch)
            EndIf
     
            $sRegDefault = RegRead("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\" & $sExt, "ProgID")
     
            If $sRegDefault = "" Then $sRegDefault = RegRead("HKCR\" & $sExt, "")
            If $sRegDefault <> "" Then $sDefIcon = RegRead("HKCR\" & $sRegDefault & "\DefaultIcon", "")
        EndIf
     
        If
    $sDefIcon = "" Then
            $sIconFile = "shell32.dll"
        ElseIf $sDefIcon <> "%1" Then
            If
    StringRegExpReplace($sFile, "^.*\\", "") = "shell32.dll" Then
                $sIconFile = $sFile
                $nIcon
    = 0
            Else
                Local
    $aDefIconSplit = StringSplit($sDefIcon, ",")
     
                If IsArray($aDefIconSplit) Then
                    $sIconFile = $aDefIconSplit[1]
                    If $aDefIconSplit[0] > 1 Then $nIcon = $aDefIconSplit[2]
                Else
                    $iError = 1
                EndIf
            EndIf
        ElseIf
    $sDefIcon = "%1" Then
            $sIconFile = $sFile
            $nIcon
    = 0
        EndIf
     
        Dim
    $aRet[3] = [2, _Expand_Environments($sIconFile), $nIcon]
     
        Return SetError($iError, 0, $aRet)
    EndFunc
     
    Func
    _Expand_Environments($sString)
        $sString = StringReplace($sString, "%windir%", @WindowsDir)
        $sString = StringRegExpReplace($sString, "%HomeDrive%|%SystemDrive%", @HomeDrive)
        $sString = StringReplace($sString, "%HomePath%", @HomePath)
        $sString = StringReplace($sString, "%Temp%", @TempDir)
        $sString = StringReplace($sString, "%ProgramFiles%", @ProgramFilesDir)
        $sString = StringReplace($sString, "%UserProfile%", @UserProfileDir)
        $sString = StringReplace($sString, "%AppData%", @AppDataDir)
        $sString = StringReplace($sString, "%ComSpec%", @ComSpec)
     
        Return $sString
    EndFunc

     

    Цитата:
    Видимо данному типу файла соответствует несколько иконок

    Функция возвращает массив, где первый элемент это путь к файлу содержащему иконку, второй элемент ([2]) это имя иконки (Icon ID).
     

    Цитата:
    Как предотвратить выгрузку скрипта ?

    Как используется функция? вообще я сам не понимаю этого, в функциях WinAPI намеренно происходит выход из скрипта при появлении ошибки. _WinAPI_Check() в _GUIImageList_AddIcon как раз и вызывает выход из скрипта (точнее она вызывает другую функцию для отображения ошибки, а та закрывает скрипт).
     

    Цитата:
    устанавливаю холостой Case $bt2 и ставлю ContinueCase

    В принципе это верное решение, для того ContinueCase и существует (не только, конечно)
     
    Но в данной ситуации можно немного подругому сделать, просто “прыгнуть” в начало цикла...
     

    Код:
    While 1
        $msg = GUIGetMsg()
     
        Switch $msg
            Case $bt1
                $a
    = Func1
     
                If $a = 0 Then ContinueLoop ;тут попадаем в начало цикла (к While 1)
     
                $b = Func2
                $c = Func3
        EndSwitch
    WEnd

     


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

    Всего записей: 3251 | Зарегистр. 01-04-2006 | Отправлено: 10:06 12-04-2008
    gregaz



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ViSiToR , Спасибо  
     
    Просьба посмотреть на Тестовом скрипте (правда и скорость обработки осталась такая же)
    При попытке внести в ImageList иконку файла с расширениями :
    $ext='exe' or  $ext='htm' or $ext='html' or $ext='wjr' or $ext='js'  и возможно еще какими -то  
    выдается системное Error : _GUIImageList_AddIcon : -1  
    и скрипт выгружается ?
    Такое впечатление, что система ругается на то,что разным файлам присвоена одна иконка  
    или наоборот одинаковым файлам -разные ?
     

    Код:
    #include <File.au3>
    #include <Array.au3>
    #include <GuiImageList.au3>
     
    $gui= GuiCreate("Test",600, 500)
    $hListView = _GUICtrlListView_Create ($gui, "",15,10,480,472,BitOR($LVS_REPORT,$LVS_SHOWSELALWAYS))
    ;Назначение иконок
        $hImage = _GUIImageList_Create (16,16,5); 5-ФОН ОКНА
        _GUIImageList_AddIcon ($hImage, "shell32.dll", 0)
        _GUICtrlListView_SetImageList ($hListView, $hImage, 1)
    ; Создание колонок в ListView
         _GUICtrlListView_InsertColumn ($hListView, 0, "Имя", 220)
         _GUICtrlListView_InsertColumn ($hListView, 1, "Тип", 70)
    $folder=@ProgramFilesDir&'\'&'Download Master'
    ;$folder=@ProgramFilesDir&'\'&'AutoIt3\Include'
    $FileList=_FileListToArray($folder,"*",0)
    $indImageList=0
    For $i=1 To UBound($FileList)-1
        $indImageList = $indImageList+1
        _GUICtrlListView_AddItem ($hListView, $FileList[$i])
        $arIcon=_FileGetIcon($folder&'\'&$FileList[$i])
        MsgBox(0,'$FileList[$i] = '&$FileList[$i],$arIcon[1]&@CRLF& $arIcon[2])
        _GUIImageList_AddIcon ($hImage, $arIcon[1], $arIcon[2])
       _GUICtrlListView_SetItemImage ($hListView,$i-1, $indImageList)
    Next
    GUISetState ()
    While 1
       $msg = GUIGetMsg()
       Switch $msg
          Case -3
                Exit
       EndSwitch
    WEnd
     
    Func
    _FileGetIcon($sFile)
        Local $sRegDefault = "", $sDefIcon = "", $sExt, $hSearch, $sIconFile, $nIcon=0
        Local $aRet[3], $iError = 0
     
        If _IsFolder($sFile) Then
            $sRegDefault = RegRead("HKCR\Folder", "")
            If $sRegDefault <> "" Then $sDefIcon = RegRead("HKCR\Folder\DefaultIcon", "")
        Else
            $sExt = StringRegExpReplace($sFile, '^.*\.', '.')
     
            If $sExt = ".lnk" Then
                Local
    $aLinkInfo = FileGetShortcut($sFile)
     
                If Not @error Then
                    Dim
    $aRet[3] = [2, _Expand_Environments($aLinkInfo[4]), $aLinkInfo[5]]
                    Return $aRet
                EndIf
            EndIf
     
            If
    $sExt = $sFile Then
                $hSearch = FileFindFirstFile($sFile & ".*")
                $sExt = StringRegExpReplace(FileFindNextFile($hSearch), '^.*\.', '.')
                $sFile &= $sExt
                FileClose($hSearch)
            EndIf
     
            $sRegDefault = RegRead("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\" & $sExt, "ProgID")
     
            If $sRegDefault = "" Then $sRegDefault = RegRead("HKCR\" & $sExt, "")
            If $sRegDefault <> "" Then $sDefIcon = RegRead("HKCR\" & $sRegDefault & "\DefaultIcon", "")
        EndIf
     
        If
    $sDefIcon = "" Then
            $sIconFile = "shell32.dll"
        ElseIf $sDefIcon <> "%1" Then
            If
    StringRegExpReplace($sFile, "^.*\\", "") = "shell32.dll" Then
                $sIconFile = $sFile
                $nIcon
    = 0
            Else
                Local
    $aDefIconSplit = StringSplit($sDefIcon, ",")
     
                If IsArray($aDefIconSplit) Then
                    $sIconFile = $aDefIconSplit[1]
                    If $aDefIconSplit[0] > 1 Then $nIcon = $aDefIconSplit[2]
                Else
                    $iError = 1
                EndIf
            EndIf
        ElseIf
    $sDefIcon = "%1" Then
            $sIconFile = $sFile
            $nIcon
    = 0
        EndIf
     
        Dim
    $aRet[3] = [2, _Expand_Environments($sIconFile), $nIcon]
     
       Return SetError($iError, 0, $aRet)
    EndFunc
     
    Func
    _Expand_Environments($sString)
        $sString = StringReplace($sString, "%windir%", @WindowsDir)
        $sString = StringRegExpReplace($sString, "%HomeDrive%|%SystemDrive%", @HomeDrive)
        $sString = StringReplace($sString, "%HomePath%", @HomePath)
        $sString = StringReplace($sString, "%Temp%", @TempDir)
        $sString = StringReplace($sString, "%ProgramFiles%", @ProgramFilesDir)
        $sString = StringReplace($sString, "%UserProfile%", @UserProfileDir)
        $sString = StringReplace($sString, "%AppData%", @AppDataDir)
        $sString = StringReplace($sString, "%ComSpec%", @ComSpec)
     
        Return $sString
    EndFunc
     
    Func
    _IsFolder($name)
        Return StringInStr(FileGetAttrib($name), "D")
    EndFunc

    Всего записей: 79 | Зарегистр. 02-06-2007 | Отправлено: 17:21 12-04-2008 | Исправлено: gregaz, 17:24 12-04-2008
    usr721

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    - Нужно управлять звуком по горячим кнопкам (+- в процентах) с отображением osd о текущем состоянии
    - Сворачивать программы в трей (например по нажаитю правой кнопкой по свернуть, или скроллом)
    Может быть есть у кого готовые наработки

    Всего записей: 721 | Зарегистр. 10-07-2006 | Отправлено: 21:36 12-04-2008
    Leony8



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Для этих целей я использую PowerPro, а не AutoIT.

    Всего записей: 47 | Зарегистр. 24-07-2006 | Отправлено: 21:12 13-04-2008
    ViSiToR



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

    Цитата:
    При попытке внести в ImageList иконку файла с расширениями

    У меня всё нормально с этим примером, никаких ошибок. Если раскомментировать строчку со вторым $folder (убрав include), тогда выдаётся ошибка.. причина в том, что для файла Au3Check.exe нет иконки, тут то и определяется ошибка. Опять же, для меня очень всё это странно, UDF'ы не должны так себя вести.
     
    А почему именно _GUIImageList_AddIcon нужно использовать? можно ведь встроенными средствами...
     

    Код:
    #include <GuiConstants.au3>
    #include <File.au3>
     
    $Gui = GUICreate("Test", 600, 500)
     
    $hListView = GUICtrlCreateListView("Имя|Тип", 15, 10, 480, 472, BitOR($LVS_REPORT, $LVS_SHOWSELALWAYS))
     
    $Folder = @ProgramFilesDir & '\AutoIt3'
    $aFileList =_FileListToArray($Folder, "*", 0)
     
    For $i = 1 To UBound($aFileList)-1
        $aIcon = _FileGetIcon($Folder & '\' & $aFileList[$i])
     
        ;Проверка на наличие иконки, если нет ни одной, присваиваем системную (ну или для exe'шника отдельно)
        $aIcons = DllCall("Shell32.dll", "int", "ExtractIconEx", "str", $aIcon[1], _
            "int", -1, "ptr", 0, "ptr", 0, "int", 0)
     
        If $aIcons[0] < 1 Then
            $aIcon[1] = "shell32.dll"
            If StringRegExpReplace($aFileList[$i], "^.*\.", "") = "exe" Then $aIcon[2] = 2
        EndIf
     
        GUICtrlCreateListViewItem($aFileList[$i], $hListView)
        GUICtrlSetImage(-1, $aIcon[1], -$aIcon[2]-1)
    Next
     
    GUISetState()
     
    While 1
        Switch GUIGetMsg()
            Case -3
                Exit
        EndSwitch
    WEnd

     
    Тут нужно функии только добавить, нет смысла постоянно их повторять в ответах.
     
    Добавлено:
    В принципе, для решения проблемы с использованием UDF'ов, можно просто закомментировать строчку:
     

    Код:
    _WinAPI_ShowError($sFunction & ": " & $vError)

     
    В функции _WinAPI_Check() (в библиотеке AutoIt3\Includes\WinAPI.au3).
     
    Добавлено:
    Вот рабочий пример для случая когда иконка не найдена (при условии что строчка с ShowError закомментирована):
     

    Код:
    #include <File.au3>
    #include <Array.au3>
    #include <GuiImageList.au3>
     
    $Gui = GUICreate("Test",600, 500)
    $hListView = _GUICtrlListView_Create($Gui, "", 15, 10, 480, 472, BitOR($LVS_REPORT, $LVS_SHOWSELALWAYS))
     
    ;Назначение иконок
    $hImage = _GUIImageList_Create(16, 16, 5); 5-ФОН ОКНА
    _GUIImageList_AddIcon($hImage, "shell32.dll", 0)
    _GUICtrlListView_SetImageList($hListView, $hImage, 1)
     
    ; Создание колонок в ListView
    _GUICtrlListView_InsertColumn($hListView, 0, "Имя", 220)
    _GUICtrlListView_InsertColumn($hListView, 1, "Тип", 70)
     
    $Folder = @ProgramFilesDir & "\AutoIt3"
    $aFileList = _FileListToArray($Folder, "*")
     
    For $i = 1 To UBound($aFileList)-1
        _GUICtrlListView_AddItem($hListView, $aFileList[$i])
     
        $aIcon = _FileGetIcon($Folder & '\' & $aFileList[$i])
     
        If _GUIImageList_AddIcon($hImage, $aIcon[1], $aIcon[2]) = -1 Then
            $aIcon[1] = "shell32.dll"
            _GUIImageList_AddIcon($hImage, $aIcon[1], $aIcon[2])
        EndIf
     
        _GUICtrlListView_SetItemImage($hListView, $i-1, $i)
    Next
     
    GUISetState()
     
    While 1
        Switch GUIGetMsg()
            Case -3
                Exit
        EndSwitch
    WEnd


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

    Всего записей: 3251 | Зарегистр. 01-04-2006 | Отправлено: 02:17 14-04-2008 | Исправлено: ViSiToR, 02:25 14-04-2008
    gregaz



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

    Цитата:
    А почему именно _GUIImageList_AddIcon нужно использовать? можно ведь встроенными средствами...

    При использовании встроенных средств и GUICtrlSetImage вообще проблем не возникает, но мне уже надоело прыгать с встроенных ф-ий на UDF и обратно (то там,то здесь в дальнейшем натыкаюсь на возникаюшие проблемы несовместимости
    Остановился на UDF

    Цитата:
    В принципе, для решения проблемы с использованием UDF'ов, можно просто закомментировать строчку:

    По-моему она у меня закомментирована :

    Код:
     
    Func _WinAPI_Check($sFunction, $fError, $vError, $fTranslate = False)
        If $fError Then
            If $fTranslate Then $vError = _WinAPI_GetLastErrorMessage()
            _WinAPI_ShowError($sFunction & ": " & $vError)
        EndIf
    EndFunc   ;==>_WinAPI_Check
     

    Просьба помочь отловить причину ошибки,и найти возможность обойти ее  
    В папке  Download Master ошибка возникает на файле :
     dmie.htm ($aIcon[1]= '%1', $aIcon[2]=0 )
    В папке  ReGetDx  - default.wjr , где $aIcon[2]=-2113
    Ну можно назначить на расширение wjr  какую-нибудь иконку, на htm другую,но возникают новые :
     на папке ABBYY Lingvo 12  ошибка на файле Abbrev.lsd ( $aIcon[1]="C:\Program Files\ABBYY Lingvo 12\Lingvo.exe" , $aIcon[2]=3 )  и отловить по расширению не удается
    Видимо все дело в ф-ии _GUICtrlListView_SetItemImage
    Может можно изменить способ записи в ImageList  
    Ведь похоже мы несмотря на то,что эта иконка уже записывалась в него продолжаем добавлять иконку в него ?
    Может можно скорректировать саму ф-ю _GUICtrlListView_SetItemImage ?

    Всего записей: 79 | Зарегистр. 02-06-2007 | Отправлено: 07:58 14-04-2008 | Исправлено: gregaz, 08:21 14-04-2008
    Maza Faka



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

    Цитата:
    - Нужно управлять звуком по горячим кнопкам (+- в процентах) с отображением osd о текущем состоянии

    Пробуй:

    Код:
    HotKeySet("^=", "_VolIncrease")
    HotKeySet("^-", "_VolDecrease")
    HotKeySet("{Pause}", "_Exit")
     
    Global $VolPercent = 0
     
    SoundSetWaveVolume($VolPercent)
     
    ToolTip("Volume = 0%", 0, 0)
     
    While 1
        Sleep(100)
    WEnd
     
    Func
    _VolIncrease()
        If $VolPercent = 100 Then Return False
        $VolPercent += 10
        SoundSetWaveVolume($VolPercent)
        ToolTip("")
        ToolTip("Volume = " & $VolPercent & "%", 0, 0)
    EndFunc
     
    Func
    _VolDecrease()
        If $VolPercent = 0 Then Return False
        $VolPercent -= 10
        SoundSetWaveVolume($VolPercent)
        ToolTip("")
        ToolTip("Volume = " & $VolPercent & "%", 0, 0)
    EndFunc
     
    Func
    _Exit()
        ToolTip("")
        Exit
    EndFunc

     
    Добавлено:
    usr721

    Цитата:
    - Сворачивать программы в трей (например по нажаитю правой кнопкой по свернуть, или скроллом)  
    Может быть есть у кого готовые наработки

    Попробуй так:

    Код:
    #include <GuiConstants.au3>
    #include <Misc.au3>
     
    Opt("TrayMenuMode", 1)
    Opt("TrayOnEventMode", 1)
     
    $hGui = GUICreate("Test", 300, 200)
     
    $RestoreItem = TrayCreateItem("Restore")
    TrayItemSetState(-1, $TRAY_DISABLE)
    TrayItemSetOnEvent(-1, "_Restore")
     
    $ExitItem = TrayCreateItem("Exit")
    TrayItemSetOnEvent(-1, "_Exit")
     
    GUIRegisterMsg($WM_NCHITTEST, "WM_NCHITTEST")
     
    GUISetState()
     
    $DllHandle = DllOpen("user32.dll")
     
    Do
    Until
    GUIGetMsg() = $GUI_EVENT_CLOSE
     
    DllClose($DllHandle)
     
    Func WM_NCHITTEST($hWnd, $Msg, $wParam, $lParam)
        Local $iX, $iY, $iProc
     
        $iProc
    = DllCall("user32.dll", "int", "DefWindowProc", "hwnd", $hWnd, "int", $Msg, "wparam", $wParam, "lparam", $lParam)
        $iProc = $iProc[0]
     
        If ($iProc = $HTMINBUTTON) And (_IsPressed(02, $DllHandle) = 1) Then
            TrayItemSetState($RestoreItem, $TRAY_ENABLE)
            GUISetState(@SW_HIDE, $hGui)
        EndIf
     
        Return
    $GUI_RUNDEFMSG
    EndFunc
     
    Func
    _Exit()
        Exit
    EndFunc
     
    Func
    _Restore()
        TrayItemSetState($RestoreItem, $TRAY_DISABLE)
        GUISetState(@SW_SHOW, $hGui)
    EndFunc

     
    Leony8

    Цитата:
    Для этих целей я использую PowerPro, а не AutoIT.


    Если нечем помочь, то уж лучше и не постить ничего, топик посвящён программе AutoIt, если ты не заметил. Представь, что будет, если каждый, кому не лень будет постить здесь своё мнение о том, какую бы программу он задействовал для решения той или иной задачи.

    Всего записей: 1420 | Зарегистр. 25-10-2006 | Отправлено: 08:17 14-04-2008
    ViSiToR



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

    Цитата:
    По-моему она у меня закомментирована

    Нет, нужно так:
     

    Код:
    Func _WinAPI_Check($sFunction, $fError, $vError, $fTranslate = False)  
        If $fError Then  
            If $fTranslate Then $vError = _WinAPI_GetLastErrorMessage()  
            ;_WinAPI_ShowError($sFunction & ": " & $vError)  
        EndIf  
    EndFunc   ;==>_WinAPI_Check

     

    Цитата:
    Просьба помочь отловить причину ошибки,и найти возможность обойти ее  

    Я в своём предыдущем сообщении привёл пример, ты его пробовал запускать на проблемные папки?

    Всего записей: 3251 | Зарегистр. 01-04-2006 | Отправлено: 18:16 14-04-2008
    ynbIpb



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Уважаемые, есть пара вопосов.
     
    1. Мой скрипт запускает игру (lineage2). Бывает что запущено несколько окон этой игры как в полноэкранном виде так и в оконном. как мне идентифицировать какждое окно и не спутаться в них? сейчас определяю его только по заголовку
    WinWaitActive("Lineage II","",60); ожидаем окна игры
     
    2. Есть у меня в скрипте такое место, где читается вся секция из ини файла и если там нет ни одно ключа, то @error должно возвратить 1, но как написано в хелпе значение сохраняется до момента вызова следующей функции. А мне нужно о нём вспомнить немного дальше на другом участке кода я сделал так,сразу после команды чтения секции вставил:
    $error = @error
    Правильно ли это? или есть более грамотный способ?
     
    3. Заполняю я Combo (выпадающий список) ключами из секции *.ini файла.
    Ключей может быть сколько угодно и нужно их все внести в комбо. Сделал так:

    Код:
    For $i = 1 To $inisection[0][0]
            GUICtrlSetData($Combo1, $inisection[$i][1],$first);заполняем выпадающий список
        Next

    оно так добавляет по 1 штуке пока не кончатся. Правильно ли это? Может есть грамотнее решение?

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

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maza Faka Спасибо! По первому варианту, хорошо работает. По второму - имелось ввиду сворачивать в трей уже запущенные приложения со своими иконками.
     
    И еще, я наверно после nncron не правильно понял принцип работы autoit, думал ему можно накидать заданий на определенное время + хуки на калвиши и обрабатывать все это будет один контроллер, а вроде получается что на каждый скрипт запускается свой экземпляр приложения, в общем есть ли возможность использовать программу как удобный планировщик или это чисто мощный исполнитель скриптов и придется искать другую замену крону (вынужден отказаться от него)? (нужно чтоб одна программа и планировищик, и напоминалка (желательно в 2 клика добавить напоминание), и хоткей менеджер)

    Всего записей: 721 | Зарегистр. 10-07-2006 | Отправлено: 00:33 15-04-2008
    ViSiToR



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

    Цитата:
    как мне идентифицировать какждое окно и не спутаться в них?

    Если есть текст у этого окна, то это один метод, также можно использовать классы окна, но полагаю для окон с одним заголовком, будут и классы одни и теже. Можно также проходиться по массиву всех окон ($aWinList = WinList("Lineage II"), и использовать идентификаторы окон ($aWinList[$i][1]).
     

    Цитата:
    Правильно ли это?

    Да, именно так и сохраняется уровень ошибочности после выполнения функции.
     

    Цитата:
    Может есть грамотнее решение?

    В этом случае (только лишь в целях ускорения), можно собрать все данные в переменную через разделитель данных ( | ), далее один раз заполнить Combo..
     

    Код:
    $sCombo_Content = ""
     
    For $i = 1 To $inisection[0][0]
            $sCombo_Content &= $inisection[$i][1] & "|"
    Next
     
    $sCombo_Content = StringRegExpReplace($sCombo_Content, "\A\|+|\|+$", "") ;удаляем все разделители в начале, и на конце
     
    GUICtrlSetData($Combo1, $sCombo_Content, $first) ;заполняем выпадающий список

     
    usr721

    Цитата:
    есть ли возможность использовать программу как удобный планировщик

    Есть, я уже раньше писал; AutoIt может почти(?) всё что может nncorn, и намного больше.

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

    Всего записей: 3251 | Зарегистр. 01-04-2006 | Отправлено: 02:48 15-04-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

    Рейтинг.ru