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

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

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

gyra (23-01-2020 10:51): AutoIT (Часть 4)  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200

   

Widok



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

 
Описание:

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

 
  • Справки
  • Инструменты
  • Ресурсы, посвящённые AutoIt
  • Полезные советы новичкам и не только
  • Готовые решения
  • Скрипт раскраски кода AutoIt для публикации в форумах
     


     
    За шапкой следит ViSiToR / AZJIO  

  • Всего записей: 24190 | Зарегистр. 07-04-2002 | Отправлено: 13:07 01-06-2010 | Исправлено: Maz, 12:29 10-01-2020
    ViSiToR



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    AZJIO 04:12 21-01-2011
    Цитата:
    как добавить в GUICtrlCreateEdit поддержку Ctrl+A


    Код:
    #include <GUIConstantsEx.au3>
    #include <GUIEdit.au3>
     
    $hGUI = GUICreate("Select All In Edit Demo", 300, 200)
     
    $nEdit = GUICtrlCreateEdit("", 20, 40, 260, 120)
     
    $nDummy = GUICtrlCreateDummy()
    Dim $aAccelKeys[1][2] = [["^a", $nDummy]]
    GUISetAccelerators($aAccelKeys)
     
    GUISetState(@SW_SHOW, $hGUI)
     
    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                Exit
            Case $nDummy
                _GUICtrlEdit_SetSel($nEdit, 0, -1)
        EndSwitch
    WEnd


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

    Всего записей: 3251 | Зарегистр. 01-04-2006 | Отправлено: 12:22 21-01-2011
    madmasles

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ViSiToR,
    У меня на русской Windows XP только так работает:

    Код:
    ;...
    Dim $aAccelKeys[2][2] = [["^a", $nDummy],["^ф", $nDummy]]
    ;...


    Всего записей: 1277 | Зарегистр. 25-09-2008 | Отправлено: 12:32 21-01-2011
    ViSiToR



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    madmasles 12:32 21-01-2011
    Цитата:
    У меня на русской Windows XP только так работает:

    Это связано не с русскрй XP, а с русскрй раскладкой клавиатуры, кторая выставлена по умолчанию.
     
    P.S
    Кстати мы вот так привязываемся к конкретным языкам, т.к на другой системе, где раскладка по умолчанию не русская и не английская, ни твой ни мой пример работать не будет, т.ч предусмотреть всё практический нереально

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

    Всего записей: 3251 | Зарегистр. 01-04-2006 | Отправлено: 12:54 21-01-2011
    THE GUILTY GOD



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    А есть проги которые могут сделать из *.exe файла обратно *.au3

    Всего записей: 165 | Зарегистр. 24-06-2010 | Отправлено: 05:41 22-01-2011 | Исправлено: THE GUILTY GOD, 05:41 22-01-2011
    madmasles

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

    Цитата:
    Это связано не с русской XP, а с русской раскладкой клавиатуры, которая выставлена по умолчанию.
    Если я правильно "нагуглил", то за раскладку по умолчанию в реестре отвечает ключ "1" в HKEY_USERS\.DEFAULT\Keyboard Layout\Preload. У меня 1=00000419 и 2=00000409. Поменял их местами, перезагрузился, раскладка на клавиатуре осталась русской и работает только , а не ^a. Может быть в этом "виноват" @OSLang, который у меня 0419?

    Всего записей: 1277 | Зарегистр. 25-09-2008 | Отправлено: 08:47 22-01-2011
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    madmasles
    Цитата:
    Поменял их местами, перезагрузился, раскладка на клавиатуре осталась русской
    Лучше "Панель управления" > "Язык и региональные стандарты" > вкладка "языки" > Подробнее > в комбобоксе поменять и проверять можно без перезагрузки. Хотя глюки с hotkey были по причине русифицированного фэйса, например если в эксплорере нажать Alt, то подсвечиваются подчёркиванием русские буквы, соответственно именно они будут работать и только в русской раскладке.
     
    ViSiToR
    Вчера твой пример работал, хоть англ. хоть русс по умолчанию. Сейчас опять проверил, теперь не работает в англ по умолчанию. Естественно скрипт перезапускал, при смене умолчального языка.

    Всего записей: 4409 | Зарегистр. 03-05-2006 | Отправлено: 10:55 22-01-2011 | Исправлено: AZJIO, 10:59 22-01-2011
    madmasles

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

    Цитата:
    Лучше "Панель управления" > "Язык и региональные стандарты" > вкладка "языки" > Подробнее > в комбобоксе поменять
    Поменял на Английский - работает только ^a, вернул на Русский - работает только . А это переключение можно как-то отследить?

    Всего записей: 1277 | Зарегистр. 25-09-2008 | Отправлено: 11:41 22-01-2011
    Jabbb

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    THE GUILTY GOD
    myAutToExe 2.10

    Всего записей: 406 | Зарегистр. 12-03-2005 | Отправлено: 11:51 22-01-2011
    AZJIO



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

    Цитата:
    А это переключение можно как-то отследить?  
    Не понял, ну в реестре HKEY_CURRENT_USER\Keyboard Layout\Preload меняется язык по умолчанию. Но я так и не нашёл 100% функции, которая бы распознала на каком языке выполнить hotkey, поэтому использую для hotkey клавиши, которые на любом языке будут работать.

    Всего записей: 4409 | Зарегистр. 03-05-2006 | Отправлено: 12:10 22-01-2011
    madmasles

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AZJIO
    Вроде работает так (у меня):
    Код:
    #include <GUIConstantsEx.au3>
    #include <GUIEdit.au3>
     
    $skey = ''
    $sLang = RegRead('HKEY_CURRENT_USER\Keyboard Layout\Preload', '1')
    If Not @error Then
        Switch StringRight($sLang, 4)
            Case '0409'
                $skey = '^a'
            Case '0419'
                $skey = '^ф'
                ;...
        EndSwitch
    EndIf
    $hGUI = GUICreate("Select All In Edit Demo", 300, 200)
     
    $nEdit = GUICtrlCreateEdit($skey, 20, 40, 260, 120)
    If $skey Then
        $nDummy = GUICtrlCreateDummy()
        Dim $aAccelKeys[1][2] = [[$skey, $nDummy]]
        GUISetAccelerators($aAccelKeys)
    EndIf
    GUISetState(@SW_SHOW, $hGUI)
     
    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                Exit
            Case $nDummy
                _GUICtrlEdit_SetSel($nEdit, 0, -1)
        EndSwitch
    WEnd

    Всего записей: 1277 | Зарегистр. 25-09-2008 | Отправлено: 12:41 22-01-2011
    ViSiToR



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    madmasles 12:41 22-01-2011
    Цитата:
    Вроде работает так

    А зачем реестр читать, есть же макрос @KBLayout.
     
    Кстати, я думал может вот так можно конвертировать клавиши:
     

    Код:
    $sHotKey = _HotKeyConvert("^a")
    ConsoleWrite($sHotKey & @LF)
     
    Func _HotKeyConvert($sHotKey)
        If @KBLayout = 0409 Then
            Return $sHotKey
        EndIf
     
        Local $sModifiers, $sKeys, $hGUI, $nEdit
     
        $sModifiers = StringRegExpReplace($sHotKey, "\A([+!#^]+).*\z", "\1")
        $sKeys = StringRegExpReplace($sHotKey, "\A[+!#^]+(.*)\z", "\1")
     
        $hGUI = GUICreate("_HotKeyConvert")
        $nEdit = GUICtrlCreateEdit("", 0, 0)
     
        ControlSend($hGUI, "", $nEdit, $sKeys, 1)
        $sKeys = ControlGetText($hGUI, "", $nEdit)
     
        GUIDelete($hGUI)
     
        Return $sModifiers & $sKeys
    EndFunc

     
    но у меня почему то в Edit отправляет клавиши обычно, также как они показаны в параметре.

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

    Всего записей: 3251 | Зарегистр. 01-04-2006 | Отправлено: 14:51 22-01-2011
    madmasles

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

    Цитата:
    А зачем реестр читать, есть же макрос @KBLayout.


    Всего записей: 1277 | Зарегистр. 25-09-2008 | Отправлено: 16:15 22-01-2011
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ViSiToR
    А зачем отсылать весь hotkey со всеми символами? Лишнее время на регулярное выражение и постоянно фиксить его баги. Проще послать конкретно символ например:
    Send('^'&_HotKeyConvert('a')), вот, я тоже пытался найти решение - ссылка
     
    Можно сделать функцию для раскладок на любом языке, которая будет возвращать нужный hotkey. В ней два шага, 1.Определить язык, 2.Вернуть букву соответствующую англ. на той же клавише.
    Только всё равно некоторые hotkey зависят не только от раскладки по умолчанию, но и от фэйса. А фэйс ещё делится на локализованный в ресурсах и локализация MUI. Как это всё учесть угадать не понимаю.

    Всего записей: 4409 | Зарегистр. 03-05-2006 | Отправлено: 18:58 22-01-2011
    THE GUILTY GOD



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

    Цитата:
    Jabbb

    Спасибо, то что надо!!

    Всего записей: 165 | Зарегистр. 24-06-2010 | Отправлено: 19:28 22-01-2011
    ViSiToR



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    AZJIO 18:58 22-01-2011
    Цитата:
    зачем отсылать весь hotkey со всеми символами?

    Для удобства.
     

    Цитата:
    Лишнее время на регулярное выражение

    Да ну, сколько там времени, это же делается один раз при запуске скрипта.
     

    Цитата:
    Можно сделать функцию для раскладок на любом языке, которая будет возвращать нужный hotkey. В ней два шага, 1.Определить язык, 2.Вернуть букву соответствующую англ. на той же клавише.

    Это слишком муторно.
     
    Добавлено:
    Вот, так конвертирует вроде:
     

    Код:
    $sCntrl_a = _HotKeyGetSupported("^a")
    ConsoleWrite($sCntrl_a & @LF)
     
    Func _HotKeyGetSupported($sHotKey)
        If @KBLayout = 0409 Then
            Return $sHotKey
        EndIf
     
        Local $ahLocale, $sModifiers, $sKeys, $hWnd, $nEdit = "Edit1", $iOpt_WWD = Opt("WinWaitDelay", 1)
     
        $ahLocale = DllCall('user32.dll', 'long', 'LoadKeyboardLayoutW', 'wstr', Hex(@KBLayout, 8), 'uint', 0)
     
        If Not @error And $ahLocale[0] Then
            DllCall('user32.dll', 'none', 'SendMessage', 'hwnd', WinGetHandle(AutoItWinGetTitle()), 'uint', 0x0050, 'uint', 0, 'ptr', $ahLocale[0])
        EndIf
     
        $sModifiers = StringRegExpReplace($sHotKey, "\A([+!#^]+).*\z", "\1")
        $sKeys = StringRegExpReplace($sHotKey, "\A[+!#^]+(.*)\z", "\1")
     
        Run(@AutoItExe & ' /AutoIt3ExecuteLine "If GUICreate(''_HotKeyConvert_'') And GUICtrlCreateInput('''', 0, 0) And Sleep(1000) Then $i = 1"')
     
        $hWnd = WinWait("_HotKeyConvert_", "", 2)
     
        Opt("WinWaitDelay", $iOpt_WWD)
     
        If Not $hWnd Then
            Return SetError(1, 0, $sHotKey)
        EndIf
     
        Sleep(10)
        ControlSend($hWnd, "", $nEdit, $sKeys, 1)
        Sleep(10)
        $sKeys = ControlGetText($hWnd, "", $nEdit)
     
        Return $sModifiers & $sKeys
    EndFunc

     
    Добавлено:
    AZJIO
    madmasles
     
    Нашёл кажется решение. Если процессу AutoIt установить английскую раскладку перед назначением клавиш, то работает при любой раскладке:
     

    Код:
    #include <GUIConstantsEx.au3>
    #include <GUIEdit.au3>
     
    ;THIS IS THE FIX!
    _WinAPI_LoadKeyboardLayout(0x0409)
     
    HotKeySet("^+e", "_Quit")
     
    $hGUI = GUICreate("Fix for hotkey/Accelerators assign problem", 300, 200)
    $nEdit = GUICtrlCreateEdit("", 20, 40, 260, 120)
     
    $nDummy = GUICtrlCreateDummy()
    Dim $aAccelKeys[1][2] = [["^a", $nDummy]]
    GUISetAccelerators($aAccelKeys)
     
    GUISetState(@SW_SHOW, $hGUI)
     
    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                Exit
            Case $nDummy
                _GUICtrlEdit_SetSel($nEdit, 0, -1)
        EndSwitch
    WEnd
     
    Func _Quit()
        Exit
    EndFunc
     
    Func _WinAPI_LoadKeyboardLayout($sLayoutID, $hWnd = 0)
        Local Const $WM_INPUTLANGCHANGEREQUEST = 0x50
        Local $aRet = DllCall("user32.dll", "long", "LoadKeyboardLayoutW", "wstr", Hex($sLayoutID, 8), "int", 0)
     
        If Not @error And $aRet[0] Then
            If $hWnd = 0 Then
                $hWnd = WinGetHandle(AutoItWinGetTitle())
            EndIf
     
            DllCall("user32.dll", "ptr", "SendMessage", "hwnd", $hWnd, "int", $WM_INPUTLANGCHANGEREQUEST, "int", 1, "int", $aRet[0])
            Return 1
        EndIf
     
        Return SetError(1)
    EndFunc


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

    Всего записей: 3251 | Зарегистр. 01-04-2006 | Отправлено: 01:20 23-01-2011 | Исправлено: ViSiToR, 02:47 23-01-2011
    madmasles

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ViSiToR
    Цитата:
     Если процессу AutoIt установить английскую раскладку перед назначением клавиш, то работает при любой раскладке:
    У меня работает.
    Только Вашу функцию _WinAPI_LoadKeyboardLayout(), наверное, переименовать надо, а то она будет конфликтовать с WinAPIEx.au3.

    Всего записей: 1277 | Зарегистр. 25-09-2008 | Отправлено: 07:17 23-01-2011 | Исправлено: madmasles, 09:23 23-01-2011
    elchupakabra



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите пожалуйста, возможно ли самоудаление скрипта после отработки?
    Заранее спасибо.

    Всего записей: 1571 | Зарегистр. 05-11-2005 | Отправлено: 10:47 26-01-2011
    madmasles

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

    Цитата:
    возможно ли самоудаление скрипта после отработки?

    Да.
    Самоуничтожение скрипта
    Код:
    #include <File.au3>
     
    _ScriptDestroy()
     
    MsgBox(0, '', 'Wait...', 5)
     
    Func _ScriptDestroy()
        $sTemp = _TempFile(@TempDir, '~', '.bat')
        $sPath = FileGetShortName(@ScriptFullPath)
        $hFile = FileOpen($sTemp, 2)
        FileWriteLine($hFile, '@echo off')
        FileWriteLine($hFile, ':loop')
        FileWriteLine($hFile, 'del ' & $sPath)
        FileWriteLine($hFile, 'if exist ' & $sPath & ' goto loop')
        FileWriteLine($hFile, 'del ' & $sTemp)
        FileClose($hFile)
        Run($sTemp, '', @SW_HIDE)
    EndFunc   ;==>_ScriptDestroy


    Всего записей: 1277 | Зарегистр. 25-09-2008 | Отправлено: 12:26 26-01-2011 | Исправлено: madmasles, 13:44 26-01-2011
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Утилитка - ButtonBar. Можно кидать на панель ярлыки, файлы, папки. В настройках включить "Поверх всех окон", "Вертикально". Обновил три раза.  
     
    Хочу сделать "магнит" к краям экрана, сделал такую конструкцию, вроде все верно, однако при отпуске мыши отскакивает.  
    Вопрос решён ссылка

    Всего записей: 4409 | Зарегистр. 03-05-2006 | Отправлено: 00:12 28-01-2011 | Исправлено: AZJIO, 11:01 30-01-2011
    Kar1son

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

    Код:
    $oForms = _IEFormGetCollection ($oIE)
    $iNumForms = @extended
    MsgBox(0, "Forms Info", "There are " & $iNumForms & " forms on this page")
    For $i = 0 to $iNumForms - 1
        $oForm = _IEFormGetCollection ($oIE, $i)
        MsgBox(0, "Form Info", $oForm.name)
    Next

    это кусок из примера к _IEFormGetCollection. как узнать какие еще свойства есть у $oForm кроме $oForm.name?
     
    Добавлено:

    Код:
    $oIE = _IE_Example ("form")
    $oForm = _IEFormGetObjByName ($oIE, "ExampleForm")
    _IEFormElementCheckboxSelect ($oForm, "gameBasketball", "", 1, "byValue")
         

    а если у меня на странице нужная мне форма не имеет Name?
    там 4 формы, при просмотре их имен первые две говорят, а две оставшиеся выдают нуль.

    Всего записей: 187 | Зарегистр. 23-08-2006 | Отправлено: 11:58 02-02-2011
       

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200

    Компьютерный форум Ru.Board » Компьютеры » Программы » AutoIT (Часть 3)
    gyra (23-01-2020 10:51): AutoIT (Часть 4)


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

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru