Общий раздел по AutoIt > Общие вопросы по AutoIt

НЕофициальный FAQ AutoIt

(1/6) > >>

CreatoR:
Этот FAQ будет постепенно расти, по мере появления частых вопросов на форуме.

По любым предложениям/улучшениям/поправкам смело пишите мне в ЛС.


GUI и его элементы
1. Как избежать мерцание элементов GUI при их частом обновлений?
2. Как показать прокрутку только после того, когда текст выходит за рамки edit-поля?
3. Как сменить иконку у ListView Item?
4. Как правильно создавать дочерние окна?
5. Как правильно “запоминать” позицию GUI для последующих запусков?
6. Почему лучше использовать GUICtrl* вместо Control*?

Графика
1. Как получить размер изображения?

Автоматизация
1. Как учётной записи пользователя назначить административные права?
2. Как создать учётную запись пользователя с правами администратора?

Имитирование нажатия клавиш, Send, HotKeys
1. Почему не работает HotKeySet, или как обойти проблему с раскладкой клавиатуры при отправке сочетаний клавиш?

Общие принципы написания скриптов
1. Как эффективнее организовать операторы сравнения?
2. Почему лучше использовать BitOR для добавления значении констант (например в стилях GUI)?
3. Как предотвратить критические ошибки скрипта?
4. Как отловить критические ошибки скрипта?
5. Как сопоставить номер строки из ошибки скомпилированного скрипта с исходником?

Системный Tray
1. Как создать GUI по двойному нажатию на иконку в трее?

Разное
1. Как установить пароль на запуск скрипта?
2. Как запустить скрипт вместе с Windows?
3. Как передать данные из скрипта в скрипт (интеракция)?

Интернет и сеть
1. Как включить/выключить локальное сетевое подключение?
2. Как отправить GET-запрос?
3. Как отправить POST-запрос?
4. Как отправить имя и пароль для HTTP-аутентификации?
5. Как выполнить перенаправление по ссылке, и получить перенаправленную ссылку?

Файловая система
1. Как разделить/соединить файл?

Процессы, сервисы и работа с памятью
1. Как “заморозить/разморозить” процесс?

AutoIt-специфичное
1. Как заставить FileInstall работать с каталогами?
2. Как позволить запуск только одной копии программы?

CreatoR:
Вопрос:
Как избежать мерцание элементов GUI при их частом обновлений?

Ответ:
Вариантов есть несколько...

1) Добавить в расширенные стили GUI (предпоследний параметр ExStyle) стиль $WS_EX_COMPOSITED (требует подключение WindowsConstants.au3).
Данный стиль не работает под Win 7, используйте GUIFFLabel.

2) Вместо GUICtrlSetData используйте _WinAPI_SetWindowText (требует подключение библиотеки WinAPI.au3). Также см. здесь несколько решении по теме.

Kaster:
Вопрос:
Как эффективнее организовать операторы сравнения?

Ответ:
Помимо того, что следуя справке, необходимо вместо нескольких операторов
Код: AutoIt If Statement1 Then
; Какие-то операции
EndIf
If Statement2 Then
; Какие-то операции
EndIf
...
If StatementN Then
; Какие-то операции
EndIf
 
использовать альтернативные условия, используя конструкцию
Код: AutoIt If Statement1 Then
; Какие-то операции
ElseIf Statement2 Then
; Какие-то операции
...
ElseIf StatementN Then
; Какие-то операции
EndIf
 
так же необходимо помнить о том, что интерпретатор выполняет полученные команды "сверху вниз", то есть "заходить" в "ветки" многоступенчатой условной конструкции интерпретатор будет начиная с самого верхнего и при достижения успеха выходить из всего "дерева" пропуская оставшиеся "ветки". Учитывая, что золотым правилом программирования всех времен и народов всегда было уменьшение времени выполнения кода, весьма целесообразным выглядит использование априорной информации о вероятности наступления условий в той или иной ветке многоступенчатой условной конструкции. К примеру, программист заранее знает, что числа кратные трем чередуются через два, то есть: 1 2 3 4 5 6 7 8 9, ..., 997 998 999. Представим ситуацию, когда программисту надо в цикле перебирать числа от 1 до 1000 и выполнять определенные действия в зависимости от делимости числа на 3: Если делится возводить в куб, если нет, то в квадрат. Можно предложить два способа организации такого алгоритма, проверять сначала на делимость и, соответственно, наоборот - на неделимость, и просто сравнить результаты.
Код: AutoIt $N = 1000000
; Проверка на делимость
$start = TimerInit()
For $i = 1 to $N
    If Mod($i, 3) = 0 Then
        $res = $i^3
    ElseIf Mod($i, 3) > 0
        $res = $i^2
    EndIf
Next
$elapsed1 = TimerDiff($start)

; Проверка на неделимость
$start = TimerInit()
For $i = 1 to $N
    If Mod($i, 3) > 0 Then
        $res = $i^2
    ElseIf Mod($i, 3) = 0
        $res = $i^3
    EndIf
Next
$elapsed2 = TimerDiff($start)
ConsoleWrite('Первый способ проверки показал время: ' & $elapsed1 & @CRLF & _
             'Второй способ проверки показал время: ' & $elapsed2 & @CRLF)
 
Как можно видеть, при втором способе время значительно ниже, так как в двух случаях из трех проверка завершится не перейдя во вторую ветвь, в то время, как в первом варианте цикл будет делать холостые проходы и только в одном случае из трех выходить из проверки после первой ветки. Математически это можно охарактеризовать как, мера частоты появления числа не делящегося на 3 выше этой самой меры для числа на 3 делящегося. Разница будет особенно заметной, где такие сравнения производятся в цикле из большого кол-ва итераций (как в примере выше). Исключения составляют только двухуровневые проверки (как в примере выше, но без постпроверки ElseIf) объединенные оператором Else, так как в последнем случае фактическая проверка не производится, т.к. считается, что если не выполнены все вышеперечисленные условия, то участок кода с Else и есть истина (спасибо AZJIO за поправку).

`p r o x y:
Вопрос:
Как создать GUI по двойному нажатию на иконку в трее?

Ответ:
Код: AutoIt #include <Constants.au3>
#include <GUIConstantsEx.au3>

Opt('GUIOnEventMode', 1)
Opt('TrayOnEventMode', 1)
Opt('TrayMenuMode', 1)

; созание GUI окна
$hMainGUI = GUICreate('Main win')
GUISetOnEvent($GUI_EVENT_CLOSE, '_Exit')

; назначение отображения tray меню: 0 - не отображать
TraySetClick(0)
; назначение выполнения функции при двойном нажтии левой кнопкой мышки
TraySetOnEvent($TRAY_EVENT_PRIMARYDOUBLE, '_ShowGUI')

While 1
    Sleep(10)
WEnd

Func _Exit()
    Exit
EndFunc

Func _ShowGUI()
    GUISetState(@SW_SHOW, $hMainGUI)
EndFunc

CreatoR:
Вопрос:
Как показать прокрутку только после того, когда текст выходит за рамки edit-поля?

Ответ:
Код: AutoIt #include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <GUIScrollBars.au3>
#include <ScrollBarConstants.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>

$hMain = GUICreate('Scrollbars Test', 640, 480, -1, -1, -1, $WS_EX_COMPOSITED)
$nEdit = GUICtrlCreateEdit('', 10, 10, 620, 460, BitOR($ES_WANTRETURN, $ES_AUTOHSCROLL, $ES_AUTOVSCROLL))
$hEdit = GUICtrlGetHandle($nEdit)

GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')
GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func WM_COMMAND($hWnd, $MsgID, $wParam, $lParam)
    If $hWnd = $hMain And $lParam = $hEdit And _WinAPI_HiWord($wParam) = $EN_UPDATE Then
        _GUIScrollBars_ShowScrollBar($hEdit, $SB_BOTH, True)
       
        If BitAND(DllStructGetData(_GUIScrollBars_GetScrollBarInfoEx($hEdit, $OBJID_VSCROLL), 'rgstate', 1), 1) = 1 Then
            _GUIScrollBars_ShowScrollBar($hEdit, $SB_VERT, False)
        EndIf
       
        If BitAND(DllStructGetData(_GUIScrollBars_GetScrollBarInfoEx($hEdit, $OBJID_HSCROLL), 'rgstate', 1), 1) = 1 Then
            _GUIScrollBars_ShowScrollBar($hEdit, $SB_HORZ, False)
        EndIf
    EndIf
   
    Return $GUI_RUNDEFMSG
EndFunc

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии