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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    Правильно заданный вопрос - 50% ответа!

    Еще раз извиняюсь. Просто я долго искал ответ, устал и казалось кроме курсора в Edit вообще никаких курсоров больше нет
     
    Добавлено:
    А есть ли какой-нибудь стиль, функция и т.п., чтобы в элементе combobox, если его открыть и там имеются очень длинные строки, которые не вмещаются в строке, были видны полностью в всплывающей рамке(как например есть такая же в часах виндовс-если навести на них курсор, то появится дата)? Ато у меня вся строка не вмещается в маленьком окошке combobox, что очень не удобно.

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

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    И еще маленький вопросик, можно ли в этом выражении:
    $e = StringRegExpReplace("127374", "[^374]+", "", 1)
    (нужно - в итоге после замены должно получиться "374" - заменить все, кроме группы "374")
    Сделать так, чтобы находил и заменял всю группу "374", а не любой символ из "374".  Думал сработает в скобках(т.е.:"[^(374)]+", "[^(?i374)]+" и т.д.), но так не работает. Или так нельзя?

    Всего записей: 145 | Зарегистр. 03-06-2007 | Отправлено: 21:26 02-11-2008 | Исправлено: gal7, 21:38 02-11-2008
    Leagnus

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

    Код:
    $e = StringRegExpReplace("127374", "\d{3}(\d{3})", "\1", 1)
    msgbox(0, "", $e)

    Всего записей: 148 | Зарегистр. 12-09-2008 | Отправлено: 22:02 02-11-2008 | Исправлено: Leagnus, 22:04 02-11-2008
    gal7

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Спасибо, буду разбираться.
     
    Добавлено:
    Нет, так не подойдет... Нужно именно с "все, кроме того-то".

    Всего записей: 145 | Зарегистр. 03-06-2007 | Отправлено: 22:16 02-11-2008 | Исправлено: gal7, 22:19 02-11-2008
    ViSiToR



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    gal7 21:26 02-11-2008
    Цитата:
    в итоге после замены должно получиться "374" - заменить все, кроме группы "374"

    Нужно использовать не квадратные скобки, а круглые:
     

    Код:
     
    $s374 = StringRegExpReplace("127374", "^.*(374).*", "\1")
    MsgBox(0, "", $s374)

     
    Хотя в результате получается заранее известная цифра, тогда какая цель у подобной замены?

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

    Всего записей: 3251 | Зарегистр. 01-04-2006 | Отправлено: 23:37 02-11-2008
    Tipulatoid



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Возвращаясь к теме вывода лога на экран. На офф. форуме обнаружилась GuiRichEdit.au3 UDF С ней задача сводится к следующему простому коду:
     
    guirichtest.au3 :
    Код:
    #Include <WindowsConstants.au3>
    #include <GuiConstantsEx.au3>
    #include <GuiRichEdit.au3>
     
     
    $MainColor = 0x00FF00
    ; зеленый
    $FailureColor = 0x0000FF ; красный
    $SuccessColor = 0xFFBA00 ; голубой
    $BackgroundColor = 0x000000 ; черный
    $TABS = @TAB & @TAB & @TAB & @TAB  & @TAB  & @TAB & @TAB
     
    $GUI = GUICreate("Лог",700,500)
         
    $hRichText =
    RichText_Create($GUI, 0, 0, 700, 500)
         
    RichText_BkColor ($hRichText, $BackgroundColor)
     
    GUISetState()
    _Archive_Process()
     
    While 1
         
    If
    GUIGetMsg() = $GUI_EVENT_CLOSE Then Exit
    WEnd
     
     
     
    Func
    _Archive_Process ()
         
    For $q = 1 to 150
           
    RichText_SetColor($hRichText, $MainColor)
           
    RichText_SetFont($hRichText, "Tahoma")
           
    RichText_SetFontSize ($hRichText, 14)
           
    RichText_AppendText($hRichText, $q & " Архивирую Dreamers.avi" & $TABS)
           
    RichText_SetBold($hRichText, True)
           
    If Mod ($q, 2) = 0 Then
               
    RichText_SetColor($hRichText, $SuccessColor)
               
    RichText_AppendText($hRichText, "Успешно!" & @CRLF)
           
    Else
               
    RichText_SetColor($hRichText, $FailureColor)
               
    RichText_AppendText($hRichText, "Ошибка!" & @CRLF)
           
    EndIf
           
    Sleep (20)
       
    Next
    EndFunc
    ;==> _Archive_Process

     
    Плюсы:
    1. Правильно отображает полосу прокрутки
    2. Не требует ничего устанавливать в систему (обходится kernel32.dll и user32.dll) Для меня последнее важно, т.к. хочу чтоб скрипт работал на любой машине и не требовал знания пароля администратора.
     
    И вопрос: как можно запретить любое действие мыши и клавиатуры в окне лога? Сейчас, если по ходу вывода сообщений попытаться выделить отоборажаемый текст, то всё оформление летит к чертям. Но полоса прокрутки должна остаться доступной.

    Всего записей: 349 | Зарегистр. 22-12-2006 | Отправлено: 05:16 03-11-2008 | Исправлено: Tipulatoid, 06:11 03-11-2008
    Maza Faka



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

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

    MouseSetOnEvent_UDF
    Low level hook
     
    Добавлено:
    gal7

    Цитата:
    в элементе combobox, если его открыть и там имеются очень длинные строки, которые не вмещаются в строке, были видны полностью в всплывающей рамке

    Быстрый и грубый пример:

    Код:
    #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

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



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Есть контрол ListView, в который пишется текст с разделителями. По мере добавления новой строки я делаю так, потому что GuiCtrlSetData не помогает:

    Код:
    GUICtrlDelete($list)
    $list = GUICtrlCreateListView (Всё предыдущее плюс новая строка)

    Можно ли это сделать правильней?
     
    =========== вопрос отпал, сам догадался ===========
     
    И второй вопрос - ListView широкий, в нем пять колонок, но их всё время надо раздвигать вручную. Как бы сделать фиксированное форматирование, чтобы каждая колонка имела свой размер? Пытался забить заголовки пробелами, с датой прокатило, со второй колонкой - нет. Собственно, только вторую и надо расширить, чтобы не было свободного места за пятой...
     
    ===== И это тоже сам додумал - _GUICtrlListView_GetColumnWidth =====
    Нормально так, сам с собой пообщался, сам себе объяснил...

    Всего записей: 106 | Зарегистр. 24-05-2008 | Отправлено: 09:34 03-11-2008 | Исправлено: Hackproof, 10:46 03-11-2008
    gal7

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

    Цитата:
    Хотя в результате получается заранее известная цифра, тогда какая цель у подобной замены?

    Я хотел понять принцип замены (поиска) всего кроме определённой группы символов. Мне это нужно для поиска в тексте определённого фрагмента, у которого известны начало и конец, а середина неизвестна. По идее должно было работать так: ищется известное начало, затем все кроме известного окончания и далее идет окончание-заменяю это все на пустое место. Чтобы не писать лишнего , что мне известно как сделать, я привел пример только на "поиск всего кроме указанной группы".
     

    Цитата:
    Быстрый и грубый пример:  

    Замечательно, спасибо огромное!

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

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Народ, подскажите пожалуйста как в автоите реализовать переход по элементам управления (в частности по полям "input") по нажатию клавиши Энтер.  
    Последовательность перехода как я понял из форума зависит от очередности создания контрола. Можно ли эту последовательность изменить произвольно ?

    Всего записей: 47 | Зарегистр. 03-11-2008 | Отправлено: 15:20 03-11-2008
    timsky



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

    Код:
    $login = IniRead(@ScriptDir & '\config.ini', 'Main', 'Login', '')
    If $login = '' Then $login = 'login'
     
    $pass = IniRead(@ScriptDir & '\config.ini', 'Main', 'Pass', '')
    If $pass = '' Then $pass = 'password'
     
    $type = @ScriptName
     
    Select
        Case
    $type = 'Login.exe'
            $run = RunAs($login, @ComputerName, $pass, 0, @ScriptDir & '\log.exe ' & $CmdLineRaw, @ScriptDir)
            While @error
                MsgBox(16, 'Error #' & @error, 'Error starting log.exe. Trying again...', 1)
                $run = RunAs($login, @ComputerName, $pass, 0, @ScriptDir & '\log.exe ' & $CmdLineRaw, @ScriptDir)
            WEnd
     
        Case
    $type = 'Confirm.exe'
            $run = RunAs($login, @ComputerName, $pass, 0, @ScriptDir & '\conf.exe ' & $CmdLineRaw, @ScriptDir)
            While @error
                MsgBox(16, 'Error #' & @error, 'Error starting conf.exe. Trying again...', 1)
                $run = RunAs($login, @ComputerName, $pass, 0, @ScriptDir & '\conf.exe ' & $CmdLineRaw, @ScriptDir)
            WEnd
     
        Case
    $type = 'err.exe'
            $run = RunAs($login, @ComputerName, $pass, 0, @ScriptDir & '\Error.exe ' & $CmdLineRaw, @ScriptDir)
            While @error
                MsgBox(16, 'Error #' & @error, 'Error starting Error.exe. Trying again...', 1)
                $run = RunAs($login, @ComputerName, $pass, 0, @ScriptDir & '\Error.exe ' & $CmdLineRaw, @ScriptDir)
            WEnd
     
        Case Else

     
            MsgBox(16, 'Error', 'Incorrect EXE name')
    EndSelect

     
    Она запускает определенную прогу под определенным юзером при запуске. В течение часа она может быть запущена до 10-15 раз, соответственно она также запускает необходимое столько же раз.
    Проблема в том, что через некоторое время запуск становится невозможен. Т.е. я вижу текстбокс с сообщением об ощибке запуска и @error равен 1.
    В чем проблема может быть? Просто в течение нескольких часов все может прекрасно работать, а потом БАЦ! Попробовал переименовать файл, который прога запускает и получаю такую же ошибку. Трабля в том, что у RunAs неинформативные @error

    Всего записей: 2287 | Зарегистр. 08-06-2004 | Отправлено: 21:19 03-11-2008 | Исправлено: timsky, 21:46 03-11-2008
    Tipulatoid



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maza Faka
    Спасибо за ссылки. Все вроде по ним понятно. Однако чего-то окончательный вариант написать не могу. вот что есть пока:  

    Код:
    #Include <WindowsConstants.au3>
    #include <GuiConstantsEx.au3>
    #include <GuiRichEdit.au3>
    #include <MouseSetOnEvent_UDF.au3>
    #include <Array.au3>
     
    $MainColor = 0x00FF00 ; зеленый
    $FailureColor = 0x0000FF ; красный
    $SuccessColor = 0xFFBA00 ; голубой
    $BackgroundColor = 0x000000 ; черный
    $BeginColor = 0xFF4DFF ; фиолетовый
    $TimerColor = 0x00FEFE ; желтый
     
    $TABS = @TAB & @TAB
     
    $GUI = GUICreate("Лог",700,600)
    $hRichText = RichText_Create($GUI, 0, 0, 700, 500)
    RichText_BkColor ($hRichText, $BackgroundColor)
    $Button = GUICtrlCreateButton ("Скопировать лог в буфер обмена", 250, 520, 200, 51)
    ControlFocus ($GUI, '',$Button)
    GUICtrlSetState (-1, $GUI_DISABLE)
     
     
    GUISetState()
     
    _Archive_Process()
     
    $Count = 0
    While 1
            Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                    ExitLoop
                 Case $Button
                    MsgBox(0, "", "Нажата кнопка")
                 Case $GUI_EVENT_PRIMARYDOWN
                    $Count +=1
                    ConsoleWrite ("нажата левая кнопка " & $Count & @CRLF)
                    If ControlGetFocus($GUI, $hRichText) <> "" Then
                        ConsoleWrite ("Edit Is Focused" & @CRLF)
                        ControlFocus ($GUI, '',$Button)
                    Else
                        ConsoleWrite ("Edit IsNOT Focused" & @CRLF)
                    EndIf
     
                 Case $GUI_EVENT_SECONDARYDOWN
                    $Count +=1
                    ConsoleWrite ("нажата правая кнопка " & $Count & @CRLF)
                    If ControlGetFocus($GUI, $hRichText) <> "" Then
                        ConsoleWrite ("Edit Is Focused" & @CRLF)
                        ControlFocus ($GUI, '',$Button)
                    Else
                        ConsoleWrite ("Edit IsNOT Focused" & @CRLF)
                    EndIf
            EndSwitch
    WEnd
     
     
     
    Func _Archive_Process ()
         For $q = 1 to 200
     
            _IsHoveredControl ($GUI, '', $hRichText)
     
            RichText_SetFont($hRichText, "Tahoma")
            RichText_SetFontSize ($hRichText, 10)
            $begin = TimerInit ()
            RichText_SetColor($hRichText, $BeginColor)
            RichText_AppendText($hRichText, $q & " " & @MDAY & "." & @MON & "." & @YEAR & " " & " " & @HOUR & ":" & @MIN& ":" & @SEC & $TABS)
            ControlFocus ($GUI, '',$Button)
            RichText_SetColor($hRichText, $MainColor)
            RichText_AppendText($hRichText, " Архивирую Dreamers.avi" & $TABS)
            ControlFocus ($GUI, '',$Button)
            Sleep (1)
            RichText_SetBold($hRichText, True)
            If Mod ($q, 2) = 0 Then
                RichText_SetColor($hRichText, $SuccessColor)
                $dif = TimerDiff($begin)
                RichText_AppendText($hRichText, "Успешно!" & $TABS)
                ControlFocus ($GUI, '',$Button)
            Else
                RichText_SetColor($hRichText, $FailureColor)
                $dif = TimerDiff($begin)
                RichText_AppendText($hRichText, "Ошибка!" & $TABS)
                ControlFocus ($GUI, '',$Button)
            EndIf
            RichText_SetColor($hRichText, $TimerColor)
            RichText_SetBold($hRichText, False)
            RichText_AppendText($hRichText, "(" & Round ($dif/1000, 2) & " сек.)" & @CRLF)
            ControlFocus ($GUI, '',$Button)
        Next
        GUICtrlSetState ($Button, $GUI_ENABLE)
        ControlFocus ($GUI, '',$Button)
    EndFunc ;==> _Archive_Process
     
    Func _IsHoveredControl ($hWnd, $text, $CtrlID)
        Local $iRet = False
        Local $aWin_Pos = WinGetPos($hWnd)
    ;     _ArrayDisplay ($aWin_Pos, "координаты окна")
        Local $clientSize = WinGetClientSize($hWnd)
        Local $winBorder = ($aWin_Pos[2] - $clientSize[0]) / 2
        Local $titleBarHeight = $aWin_Pos[3] - $clientSize[1] - $winBorder
        Local $aControl_Pos = ControlGetPos ($hWnd, '', $CtrlID)
        _ArrayDisplay ($aControl_Pos, "координаты контрола")
        Local $aMouse_Pos = MouseGetPos()
    ;     $controlPosAbsX = $aWin_Pos[0] + $winBorder + $aControl_Pos[0]
    ;     $controlPosAbsY = $aWin_Pos[1] + $titleBarHeight + $aControl_Pos[1]
    ;     $controlPosAbsX = $aWin_Pos[0] + $winBorder + 0
    ;     $controlPosAbsY = $aWin_Pos[1] + $titleBarHeight + 0
     
    ;          Local $aMouse_Pos = MouseGetPos()
     
     
    ;     If $aMouse_Pos[0] >= $aWin_Pos[0] And $aMouse_Pos[0] <= ($aWin_Pos[0] + $aWin_Pos[2]) And _
    ;         $aMouse_Pos[1] >= $aWin_Pos[1] And $aMouse_Pos[1] <= ($aWin_Pos[1] + $aWin_Pos[3]) Then $iRet = True
        
    ;     Local $aRet = DllCall("user32.dll", "int", "WindowFromPoint", _
    ;         "long", $aMouse_Pos[0], _
    ;         "long", $aMouse_Pos[1])
        
    ;     If Not WinActive($hWnd) Or ($aRet[0] <> $hWnd And Not $iRet) Then $iRet = False
        
    ;     Return $iRet
       
       
    EndFunc ;==> _IsHoveredControl

     
    Как видишь, пытаюсь писать функцию _IsHoveredControl по аналогии с _IsHoveredWnd из UDF Visitor'a И непонятно получается - если запускать скрипт в том виде, что приведен, то массив $aControl_Pos будет создан и отобразится командой _ArrayDisplay; если же раскомментить строки     $controlPosAbsX = $aWin_Pos[0] + $winBorder + $aControl_Pos[0]
    $controlPosAbsY = $aWin_Pos[1] + $titleBarHeight + $aControl_Pos[1]
    ; то ошибка будет, и _ArrayDisplay не покажет ничего. Мне конечно, не сложно узнать координаты контрола, я их сам забиваю в 17 строке скрипта, но все же непонятно, отчего не работает.
    И вторая непонятка. Как видишь, когда скрипт входит в цикл While я пытаюсь защитить содержимое лога от изменений просто тем, что не дать установить фокус в нем. Т .е. в случае нажатия мыши - фокус автоматически перебрасываем на кнопку Скопировать лог Это работает для случая нажатия левой кнопки мыши в логе, но правой по-прежнему можно спокойно установить фокус и менять  содержимое. В чем дело - непонятно.
     
    Добавлено:
    frb noname
    Приведи пример GUI, который рисуешь; объясни на нем в какой последовательности надо по инпутам переключаться.
    A вообще посмотри в справке _IsPressed

    Всего записей: 349 | Зарегистр. 22-12-2006 | Отправлено: 01:05 04-11-2008 | Исправлено: Tipulatoid, 01:47 04-11-2008
    Maza Faka



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

    Цитата:
     
    реализовать переход по элементам управления (в частности по полям "input") по нажатию клавиши Энтер.
     

    Что за изврат? Кому это нужно? Чем не устраивает переход по нажатию клавиши "Tab"?
     

    Цитата:
     
    Можно ли эту последовательность изменить произвольно?
     

    Опять же... для чего? Есть ведь функции для установки фокуса.
     
    timsky

    Цитата:
    Есть такая программа.

    Хм... попробуй так:

    Код:
    $login = IniRead(@ScriptDir & '\config.ini', 'Main', 'Login', 'login')
    $pass = IniRead(@ScriptDir & '\config.ini', 'Main', 'Pass', 'password')
     
    $type = @ScriptName
     
    Select
        Case
    $type = 'Login.exe'
            While 1
                $run = RunAs($login, @ComputerName, $pass, 0, @ScriptDir & '\log.exe ' & $CmdLineRaw, @ScriptDir)
                If Not @error Then ExitLoop
                MsgBox(16, 'Error #' & @error, 'Error starting log.exe. Trying again...', 1)
            WEnd
     
        Case
    $type = 'Confirm.exe'
            While 1
                $run = RunAs($login, @ComputerName, $pass, 0, @ScriptDir & '\conf.exe ' & $CmdLineRaw, @ScriptDir)
                If Not @error Then ExitLoop
                MsgBox(16, 'Error #' & @error, 'Error starting conf.exe. Trying again...', 1)
            WEnd
     
        Case
    $type = 'err.exe'
            While 1
                $run = RunAs($login, @ComputerName, $pass, 0, @ScriptDir & '\Error.exe ' & $CmdLineRaw, @ScriptDir)
                If Not @error Then ExitLoop
                MsgBox(16, 'Error #' & @error, 'Error starting Error.exe. Trying again...', 1)
            WEnd
     
        Case Else

            MsgBox(16, 'Error', 'Incorrect EXE name')
    EndSelect

    Не тестировал.
     
    Tipulatoid

    Цитата:
    по аналогии с _IsHoveredWnd из UDF Visitor'a

    Думаю, лучше будет спросить у него

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

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

    Цитата:
    Что за изврат? Кому это нужно? Чем не устраивает переход по нажатию клавиши "Tab"?  

    Ну, почему изврат ? Я привык, например при вводе цифр, пользоваться Энтером - мне так быстрее.  
    С функцией установки фокуса понятно, спасибо.  
    Но все же, как отследить нажатие энтера при нахождении в поле, чтобы после этого сменить фокус ?
    Спасибо.

    Всего записей: 47 | Зарегистр. 03-11-2008 | Отправлено: 10:24 04-11-2008
    Tipulatoid



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

    Цитата:
    как отследить нажатие энтера


    Код:
    #include <Misc.au3>
    $count = 0
    While 1
        Sleep (70)
        If _ISpressed ("0D") Then
            $count +=1
            ConsoleWrite ("Enter нажат " & $count & @CRLF)
        EndIf
    Wend

     
    Условие нахождения фокуса в инпуте тоже вставить несложно - ControlGetFocus; переместить фокус ControlFocus

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



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Tipulatoid 01:05 04-11-2008
    Цитата:
    пытаюсь писать функцию _IsHoveredControl по аналогии с _IsHoveredWnd

     
    Примерно так:
     

    Код:
     
    $IsHovered = _ControlIsHovered("[CLASS:SciTEWindow]", 350) ;Scintilla1 control
     
    ConsoleWrite($IsHovered)
     
    Func _ControlIsHovered($hWnd, $iCtrlID)
        Local $iOld_Opt_MCM, $ahWinFromPoint, $ahGetDlgCtrlID, $ahGetParent, $ahTmp_GetParent
     
        If Not IsHWnd($hWnd) Then $hWnd = WinGetHandle($hWnd)
     
        $iOld_Opt_MCM = Opt("MouseCoordMode", 1)
     
        $ahWinFromPoint = DllCall("user32.dll", "int", "WindowFromPoint", _
            "long", MouseGetPos(0), _
            "long", MouseGetPos(1))
     
        $ahGetDlgCtrlID = DllCall("user32.dll", "int", "GetDlgCtrlID", "hwnd", $ahWinFromPoint[0])
     
        $ahGetParent = DllCall("user32.dll", "hwnd", "GetParent", "hwnd", $ahWinFromPoint[0])
     
        While 1
            $ahTmp_GetParent = DllCall("user32.dll", "hwnd", "GetParent", "hwnd", $ahGetParent[0])
            If @error Or Not $ahTmp_GetParent[0] Then ExitLoop
     
            $ahGetParent = $ahTmp_GetParent
        WEnd
     
        Opt("MouseCoordMode", $iOld_Opt_MCM)
     
        If $ahGetParent[0] = $hWnd And $ahGetDlgCtrlID[0] = $iCtrlID Then Return True
        Return False
    EndFunc

     
    Но в этом случае оно не нужно, т.к $hRichText это не контрол а хендл. Т.ч тут можно было просто поверять _IsHoveredWnd. А вообще подобное можно сделать через SubClassing...
     

    Код:
    #include <GuiConstantsEx.au3>
    #include <Constants.au3>
    #Include <WindowsConstants.au3>
    #include <GuiRichEdit.au3>
    #include <WinAPI.au3>
     
    $MainColor = 0x00FF00 ; зеленый
    $FailureColor = 0x0000FF ; красный
    $SuccessColor = 0xFFBA00 ; голубой
    $BackgroundColor = 0x000000 ; черный
    $BeginColor = 0xFF4DFF ; фиолетовый
    $TimerColor = 0x00FEFE ; желтый
     
    $TABS = @TAB & @TAB
     
    $GUI = GUICreate("Лог",700,600)
     
    $hRichText = RichText_Create($GUI, 0, 0, 700, 500)
    DllCall("user32.dll", "long", "SendMessage", "hwnd", $hRichText, "int", $EM_SETREADONLY, "int", True, "int", 0)
     
    $Button = GUICtrlCreateButton ("Скопировать лог в буфер обмена", 250, 520, 200, 51)
    ControlFocus ($GUI, '',$Button)
    GUICtrlSetState (-1, $GUI_DISABLE)
     
    $wProcNew = DllCallbackRegister("_WindowProc", "ptr", "hwnd;uint;long;ptr")
    $wProcOld = _WinAPI_SetWindowLong($hRichText, $GWL_WNDPROC, DllCallbackGetPtr($wProcNew))
     
    GUISetState()
     
    While 1
        $Msg = GUIGetMsg()
     
        Select
            Case
    $Msg = -3
                Exit
        EndSelect
    WEnd
     
    Func
    _WindowProc($hWnd, $uiMsg, $wParam, $lParam)
        Switch $uiMsg
            Case $WM_SETFOCUS, $WM_SETCURSOR
                Return 0
        EndSwitch
     
        Return
    _WinAPI_CallWindowProc($wProcOld, $hWnd, $uiMsg, $wParam, $lParam)
    EndFunc


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

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



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ViSiToR
    Спасибо! Вчера полдня убил, и такого результата не добился.  
    И поправь, плиз, в примере $hRichText = RichEdit_Create($GUI, 0, 0, 700, 500) на $hRichText = RichText_Create($GUI, 0, 0, 700, 500) А то работать не будет

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



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Tipulatoid 14:02 04-11-2008
    Цитата:
    Вчера полдня убил, и такого результата не добился

    У разработчиков ушло пару лет на то чтобы добавить поддержку CallBack'ов - А я всего лишь изменил пример с оф. форума.
     

    Цитата:
    поправь, плиз, в примере $hRichText

    Вообще то у меня даже и с твоим примером не работало, библиотека GuiRichEdit что у меня содержит функции типа _GUICtrlRichEdit_*, у тебя видимо библиотека с этого топика .

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

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



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

    Цитата:
    у тебя видимо библиотека с этого топика

    да, точно

    Цитата:
    Вообще то у меня даже и с твоим примером не работало

    Ты хочешь сказать, что даже не тестишь скрипты прежде чем выложить? Ну ты маг.

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



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Tipulatoid 15:06 04-11-2008
    Цитата:
    Ты хочешь сказать, что даже не тестишь скрипты прежде чем выложить?

    Ну почему, я всегда стараюсь тестить, если не тестил (значит видимо не с дома пишу, ну или времени нет, ну или код слишком прост ), так и напишу, не тестировалось
     
    Я просто заменил имена функции, _RichText_ на _GUICtrlRichEdit. Поэтому и очепятка в имени функции была .

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

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

    Рейтинг.ru