Автор Тема: НЕофициальный FAQ AutoIt  (Прочитано 80958 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7803
  • Репутация: 2279
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
НЕофициальный FAQ AutoIt
« Создано: Февраль 05, 2011, 00:47:49 »
Этот 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. Как позволить запуск только одной копии программы?
« Последнее редактирование: Сентябрь 21, 2015, 02:39:12 от CreatoR »


Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Русское сообщество AutoIt

НЕофициальный FAQ AutoIt
« Отправлен: Февраль 05, 2011, 00:47:49 »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7803

  • Автор темы
  • Репутация: 2279
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: НЕофициальный FAQ AutoIt
« Ответ #1, Отправлен: Февраль 05, 2011, 00:51:18 »
Вопрос:
Как избежать мерцание элементов GUI при их частом обновлений?

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

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

2) Вместо GUICtrlSetData используйте _WinAPI_SetWindowText (требует подключение библиотеки WinAPI.au3). Также см. здесь несколько решении по теме.
« Последнее редактирование: Сентябрь 14, 2012, 18:25:49 от CreatoR »

Оффлайн Kaster [?]

  • Бритва, Бритва Оккама
  • Глобальный модератор
  • *
  • Сообщений: 4020
  • Репутация: 622
  • Пол: Мужской
  • Мой Аватар, он лучший самый
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: НЕофициальный FAQ AutoIt
« Ответ #2, Отправлен: Февраль 14, 2011, 14:31:20 »
Вопрос:
Как эффективнее организовать операторы сравнения?

Ответ:
Помимо того, что следуя справке, необходимо вместо нескольких операторов
Код: 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 за поправку).
« Последнее редактирование: Июль 08, 2011, 17:30:24 от CreatoR »
Конференция посвященная AutoIt на jabber.ru - autoit@conference.jabber.ru
Как попасть на конференцию читаем тут


Оффлайн `p r o x y [?]

  • Глобальный модератор
  • *
  • Сообщений: 596
  • Репутация: 156
  • Пол: Мужской
  • «Улыбайтесь, господа!»
    • WebInWeb
    • Награды
Re: НЕофициальный FAQ AutoIt
« Ответ #3, Отправлен: Февраль 20, 2011, 23:15:03 »
Вопрос:
Как создать 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

« Последнее редактирование: Июль 08, 2011, 17:31:41 от CreatoR »
1 тема – 1 вопрос.
Как правильно назвать свою тему – подскажут тут.
На форуме принято помечать тему «решенной» после получения ответа на свой вопрос.

Русское сообщество AutoIt

Re: НЕофициальный FAQ AutoIt
« Ответ #3 Отправлен: Февраль 20, 2011, 23:15:03 »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7803

  • Автор темы
  • Репутация: 2279
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: НЕофициальный FAQ AutoIt
« Ответ #4, Отправлен: Февраль 20, 2011, 23:42:48 »
Вопрос:
Как показать прокрутку только после того, когда текст выходит за рамки 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

« Последнее редактирование: Июль 08, 2011, 17:31:51 от CreatoR »

Оффлайн `p r o x y [?]

  • Глобальный модератор
  • *
  • Сообщений: 596
  • Репутация: 156
  • Пол: Мужской
  • «Улыбайтесь, господа!»
    • WebInWeb
    • Награды
Re: НЕофициальный FAQ AutoIt
« Ответ #5, Отправлен: Февраль 21, 2011, 04:59:55 »
Вопрос:
Как установить пароль на запуск скрипта?

Ответ:
Код: AutoIt [Выделить]
$sReadKey = IniRead(@ScriptDir & "\options.ini", "Options", "key", "")
$iEnterAttempts = 3
$sPassword = "parol"

If $sReadKey = $sPassword Then
    MsgBox(64, "Password:", "The password is correct!")
Else
    For $I = 1 To $iEnterAttempts
        $sReadPass = InputBox("Ввод пароля", "Введите пароль", "", "*")
       
        If @error Or Not $sReadPass Then
            Exit
        EndIf
       
        $iCheckPass = StringCompare($sReadPass, $sPassword, 1)
       
        Switch $iCheckPass
            Case 0
                MsgBox(64, "OK", "Пароль правильный!", 3)
                IniWrite(@ScriptDir & "\options.ini", "Options", "key", $sPassword)
                ExitLoop
            Case Else
                If $iEnterAttempts - $i Then
                    MsgBox(16, "Error", "Пароль не правильный." & @LF & "Осталось попыток ввода: " & $iEnterAttempts - $i, 5)
                Else
                    MsgBox(16, "Error", "Попыток ввода пароля: " & $iEnterAttempts & ", и ни одной правильной!" & @LF & "До свидания!", 5)
                    Exit
                EndIf
        EndSwitch
    Next
EndIf

« Последнее редактирование: Июль 08, 2011, 17:32:54 от CreatoR »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7803

  • Автор темы
  • Репутация: 2279
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: НЕофициальный FAQ AutoIt
« Ответ #6, Отправлен: Февраль 21, 2011, 08:04:28 »
Вопрос:
Как сменить иконку у ListView Item?

Ответ:
Тут
« Последнее редактирование: Июль 08, 2011, 17:32:18 от CreatoR »

Оффлайн `p r o x y [?]

  • Глобальный модератор
  • *
  • Сообщений: 596
  • Репутация: 156
  • Пол: Мужской
  • «Улыбайтесь, господа!»
    • WebInWeb
    • Награды
Re: НЕофициальный FAQ AutoIt
« Ответ #7, Отправлен: Февраль 21, 2011, 13:12:38 »
Вопрос:
Как учетной записи пользователя назначить административные права?

Ответ:
Код: AutoIt [Выделить]
$groupName = "Администраторы"
$userName = "User"

Run("net localgroup " & $groupName & " " & $userName & " /add", "", @SW_HIDE)

« Последнее редактирование: Июль 08, 2011, 17:33:26 от CreatoR »

Русское сообщество AutoIt

Re: НЕофициальный FAQ AutoIt
« Ответ #7 Отправлен: Февраль 21, 2011, 13:12:38 »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7803

  • Автор темы
  • Репутация: 2279
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: НЕофициальный FAQ AutoIt
« Ответ #8, Отправлен: Февраль 22, 2011, 14:21:23 »
Вопрос:
Как создать учётную запись пользователя с правами администратора?

Ответ:
Код: AutoIt [Выделить]
#Include <Security.au3>

TraySetState(2)

Dim $aSid = "S-1-5-32-544"
Dim $aresult = _Security__LookupAccountSid($aSid)
Dim $rSid = "S-1-5-32-555"
Dim $rresult = _Security__LookupAccountSid($rSid)
Dim $agroupName = $aresult[0]
Dim $rgroupName = $rresult[0]
Dim $userName = "TEST"
Dim $userPass = "pass"
$x = Chr(34)
RunWait("net user " & $userName & " " & $userPass & " /add", "", @SW_HIDE)
RunWait("net localgroup " & $x & "" & $rgroupName & "" & $x & " " & $userName & " /add", "", @SW_HIDE)
RunWait("net localgroup " & $agroupName & " " & $userName & " /add", "", @SW_HIDE)

« Последнее редактирование: Июль 08, 2011, 17:33:33 от CreatoR »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7803

  • Автор темы
  • Репутация: 2279
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: НЕофициальный FAQ AutoIt
« Ответ #9, Отправлен: Февраль 22, 2011, 14:23:12 »
Вопрос:
Как запустить скрипт вместе с Windows?

Ответ:
Код: AutoIt [Выделить]
If @Compiled Then
    _RegAddToRun()
EndIf

;Тут Ваш скрипт

Func _RegAddToRun()
    Local $sRegRun = 'HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run'
   
    If RegRead($sRegRun, @ScriptName) = '' Or RegRead($sRegRun, @ScriptName) <> @ScriptFullPath Then
        RegWrite($sRegRun, @ScriptName, 'REG_SZ', @ScriptFullPath)
    EndIf
EndFunc

« Последнее редактирование: Июль 08, 2011, 17:33:52 от CreatoR »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7803

  • Автор темы
  • Репутация: 2279
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: НЕофициальный FAQ AutoIt
« Ответ #10, Отправлен: Февраль 22, 2011, 14:23:27 »
Вопрос:
Как включить/выключить локальное сетевое подключение?

Ответ:
Код: AutoIt [Выделить]
Run(@ComSpec & ' /C netsh interface set interface "Local Area Connection" DISABLE') ; выкл "Local Area Connection"
Run(@ComSpec & ' /C netsh interface set interface "Local Area Connection" ENABLE') ; вкл "Local Area Connection"

« Последнее редактирование: Июль 08, 2011, 17:34:12 от CreatoR »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7803

  • Автор темы
  • Репутация: 2279
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: НЕофициальный FAQ AutoIt
« Ответ #11, Отправлен: Февраль 22, 2011, 14:23:48 »
Вопрос:
Как получить размер изображения?

Ответ:
Код: AutoIt [Выделить]
#include <GDIPlus.au3>

_GDIPlus_Startup()
$sFile = @MyDocumentsDir & '\Скриншоты\sshot-1.jpg'
$hBitmap = _GDIPlus_BitmapCreateFromFile($sFile)
$iPic_W = _GDIPlus_ImageGetWidth($hBitmap)
$iPic_H = _GDIPlus_ImageGetHeight($hBitmap)
_GDIPlus_ImageDispose($hBitmap)
_GDIPlus_Shutdown()
ConsoleWrite($sFile & ', 0, 0, ' & $iPic_W & ', ' & $iPic_H & @CRLF)

« Последнее редактирование: Июль 08, 2011, 17:34:30 от CreatoR »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7803

  • Автор темы
  • Репутация: 2279
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: НЕофициальный FAQ AutoIt
« Ответ #12, Отправлен: Февраль 22, 2011, 14:24:12 »
Вопрос:
Как разделить/соеденить файл?

Ответ:
(нажмите для показа/скрытия)

(нажмите для показа/скрытия)
« Последнее редактирование: Июль 08, 2011, 17:35:10 от CreatoR »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7803

  • Автор темы
  • Репутация: 2279
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: НЕофициальный FAQ AutoIt
« Ответ #13, Отправлен: Июнь 22, 2011, 19:10:43 »
Вопрос:
Как правильно создавать дочерние окна?

Ответ:
В функций GUICreate имеется параметр hWnd (последний/8-ой параметр), в качестве которого нужно указывать дескриптор родительского окна.
Также желательно “отключить” родительское окно, чтобы пользователь мог работать только с дочерним.
Вот пример создания подобного дочернего окна:

Код: AutoIt [Выделить]
#Include <GUIConstantsEx.au3>

$hMain_GUI = GUICreate('Main GUI', 600, 500)
$nSttngs_Button = GUICtrlCreateButton('Settings', 20, 470, 70, 20)
GUISetState(@SW_SHOW, $hMain_GUI)

While 1
    $nMsg = GUIGetMsg()
   
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $nSttngs_Button
            _Settings_Dlg($hMain_GUI)
    EndSwitch
WEnd

Func _Settings_Dlg($hParent = 0)
    Local $hSettings, $iGOEM_Opt
   
    ;Предотвращение проблем в случае если главный GUI использует режим событий
    $iGOEM_Opt = Opt("GUIOnEventMode", 0)
   
    $hSettings_GUI = GUICreate('Settings', 500, 300, -1, -1, -1, -1, $hParent)
   
    ;...
   
    GUISetState(@SW_DISABLE, $hParent)
    GUISetState(@SW_SHOW, $hSettings_GUI)
   
    While 1
        $nMsg = GUIGetMsg()
       
        Switch $nMsg
            Case $GUI_EVENT_CLOSE
                ExitLoop
        EndSwitch
    WEnd
   
    Opt("GUIOnEventMode", $iGOEM_Opt)
    GUISetState(@SW_ENABLE, $hParent)
    GUIDelete($hSettings_GUI)
EndFunc


Но иногда требуется создавать дочерние окна имея возможность работать и в главном, родительском окне.
Для этого желательно создавать дочернее окно сразу, и обрабатывать события для всех его элементов в главном цикле.
Вот пример:

Код: AutoIt [Выделить]
#include <GUIConstantsEx.au3>

;Обязательно задавать элементам -1, чтобы небыло ложного срабатывания событий в случае если (ещё) не создан элемент присваеваемый данной переменной
Global $nChildGUI_Close_Bttn = -1

$hMain_GUI = GUICreate("Main GUI", 250, 250)
$nChild_Button = GUICtrlCreateButton("Child", 20, 220, 60, 20)

GUISetState(@SW_SHOW, $hMain_GUI)

;Создаём дочерний GUI, не отображая его на экране
$hChild_GUI = _ChildGUI_Create($hMain_GUI)

While 1
    ;Обработка событий в расширенном режиме
    $aMsg = GUIGetMsg(1)
   
    Switch $aMsg[0]
        Case $GUI_EVENT_CLOSE
            ;Проверяем если "событие закрытия" поступило с главного-родительского GUI
            If $aMsg[1] = $hMain_GUI Then Exit
           
            ;Если "событие закрытия" поступило с дочернего GUI, то просто прячем его
            If $aMsg[1] = $hChild_GUI Then
                GUISetState(@SW_HIDE, $hChild_GUI)
            EndIf
        Case $nChild_Button
            ;Показываем дочерний GUI при нажатий на кнопку "Child"
            GUISetState(@SW_SHOW, $hChild_GUI)
            If Not WinActive($hChild_GUI) Then WinActivate($hChild_GUI)
        Case $nChildGUI_Close_Bttn
            MsgBox(64, 'Message', 'Child GUI "Close" button pressed, closing the child...', 3)
            GUISetState(@SW_HIDE, $hChild_GUI)
    EndSwitch
WEnd

Func _ChildGUI_Create($hParent)
    Local $hChild_GUI
   
    $hChild_GUI = GUICreate("Child GUI", 200, 200, -1, -1, -1, -1, $hParent)
   
    ;Создаём элементы тут
    $nChildGUI_Close_Bttn = GUICtrlCreateButton("Close", 20, 170, 60, 20)
   
    Return $hChild_GUI
EndFunc

« Последнее редактирование: Июль 08, 2011, 17:35:33 от CreatoR »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7803

  • Автор темы
  • Репутация: 2279
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: НЕофициальный FAQ AutoIt
« Ответ #14, Отправлен: Июль 02, 2011, 04:09:08 »
Вопрос:
Как “заморозить/разморозить” процесс?

Ответ:
Код: AutoIt [Выделить]
$iProc = ProcessExists("Process.exe")

_ProcessSuspend($iProc) ;"Заморозка" процесса
Sleep(2000)
_ProcessResume($iProc) ;"Разморозка" процесса



;===============================================================================
;
; Description:      Suspend all Threads in a Process
; Parameter(s):     $vProcess - Name or PID of Process
; Requirement(s):   3.1.1.130, Win ME/2k/XP
; Return Value(s):  On Success - Returns Nr. of Threads Suspended and Set @extended to Nr. of Threads Processed
;                   On Failure - Returns False and Set
;                                               @error to:  1 - Process not Found
;                                                           2 - Error Calling 'CreateToolhelp32Snapshot'
;                                                           3 - Error Calling 'Thread32First'
;                                                           4 - Error Calling 'Thread32Next'
;                                                           5 - Not all Threads Processed
; Author(s):        Florian 'Piccaso' Fida
; Note(s):          Ported from: http://www.codeproject.com/threads/pausep.asp
;                   Better read the article (and the warnings!) if you want to use it :)
;
;===============================================================================
Func _ProcessSuspend($vProcess, $iReserved = 0)
    Local $iPid, $vTmp, $hThreadSnap, $ThreadEntry32, $iThreadID, $hThread, $iThreadCnt, $iThreadCntSuccess, $sFunction
    Local $TH32CS_SNAPTHREAD = 0x00000004
    Local $INVALID_HANDLE_VALUE = 0xFFFFFFFF
    Local $THREAD_SUSPEND_RESUME = 0x0002
    Local $THREADENTRY32_StructDef = "int;" _; 1 -> dwSize
             & "int;" _; 2 -> cntUsage
             & "int;" _; 3 -> th32ThreadID
             & "int;" _; 4 -> th32OwnerProcessID
             & "int;" _; 5 -> tpBasePri
             & "int;" _; 6 -> tpDeltaPri
             & "int" ; 7 -> dwFlags
    $iPid = ProcessExists($vProcess)
    If Not $iPid Then Return SetError(1, 0, False) ; Process not found.
    $vTmp = DllCall("kernel32.dll", "ptr", "CreateToolhelp32Snapshot", "int", $TH32CS_SNAPTHREAD, "int", 0)
    If @error Then Return SetError(2, 0, False) ; CreateToolhelp32Snapshot Failed
    If $vTmp[0] = $INVALID_HANDLE_VALUE Then Return SetError(2, 0, False) ; CreateToolhelp32Snapshot Failed
    $hThreadSnap = $vTmp[0]
    $ThreadEntry32 = DllStructCreate($THREADENTRY32_StructDef)
    DllStructSetData($ThreadEntry32, 1, DllStructGetSize($ThreadEntry32))
    $vTmp = DllCall("kernel32.dll", "int", "Thread32First", "ptr", $hThreadSnap, "long", DllStructGetPtr($ThreadEntry32))
    If @error Then Return SetError(3, 0, False) ; Thread32First Failed
    If Not $vTmp[0] Then
        DllCall("kernel32.dll", "int", "CloseHandle", "ptr", $hThreadSnap)
        Return SetError(3, 0, False) ; Thread32First Failed
    EndIf
    While 1
        If DllStructGetData($ThreadEntry32, 4) = $iPid Then
            $iThreadID = DllStructGetData($ThreadEntry32, 3)
            $vTmp = DllCall("kernel32.dll", "ptr", "OpenThread", "int", $THREAD_SUSPEND_RESUME, "int", False, "int", $iThreadID)
            If Not @error Then
                $hThread = $vTmp[0]
                If $hThread Then
                    If $iReserved Then
                        $sFunction = "ResumeThread"
                    Else
                        $sFunction = "SuspendThread"
                    EndIf
                    $vTmp = DllCall("kernel32.dll", "int", $sFunction, "ptr", $hThread)
                    If $vTmp[0] <> -1 Then $iThreadCntSuccess += 1
                    DllCall("kernel32.dll", "int", "CloseHandle", "ptr", $hThread)
                EndIf
            EndIf
            $iThreadCnt += 1
        EndIf
        $vTmp = DllCall("kernel32", "int", "Thread32Next", "ptr", $hThreadSnap, "long", DllStructGetPtr($ThreadEntry32))
        If @error Then Return SetError(4, 0, False) ; Thread32Next Failed
        If Not $vTmp[0] Then ExitLoop
    WEnd
    DllCall("kernel32.dll", "int", "CloseToolhelp32Snapshot", "ptr", $hThreadSnap) ; CloseHandle
    If Not $iThreadCntSuccess Or $iThreadCnt > $iThreadCntSuccess Then Return SetError(5, $iThreadCnt, $iThreadCntSuccess)
    Return SetError(0, $iThreadCnt, $iThreadCntSuccess)
EndFunc

;===============================================================================
;
; Description:      Resume all Threads in a Process
; Parameter(s):     $vProcess - Name or PID of Process
; Requirement(s):   3.1.1.130, Win ME/2k/XP
; Return Value(s):  On Success - Returns Nr. of Threads Resumed and Set @extended to Nr. of Threads Processed
;                   On Failure - Returns False and Set
;                                               @error to:  1 - Process not Found
;                                                           2 - Error Calling 'CreateToolhelp32Snapshot'
;                                                           3 - Error Calling 'Thread32First'
;                                                           4 - Error Calling 'Thread32Next'
;                                                           5 - Not all Threads Processed
; Author(s):        Florian 'Piccaso' Fida
; Note(s):          Ported from: http://www.codeproject.com/threads/pausep.asp
;                   Better read the article (and the warnings!) if you want to use it :)
;
;===============================================================================
Func _ProcessResume($vProcess)
    Local $fRval = _ProcessSuspend($vProcess, True)
    Return SetError(@error, @extended, $fRval)
EndFunc

« Последнее редактирование: Июль 08, 2011, 17:37:08 от CreatoR »

Русское сообщество AutoIt

Re: НЕофициальный FAQ AutoIt
« Ответ #14 Отправлен: Июль 02, 2011, 04:09:08 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
16 Ответов
58219 Просмотров
Последний ответ Сентябрь 15, 2009, 15:41:00
от El Panda
4 Ответов
7549 Просмотров
Последний ответ Июнь 13, 2010, 23:47:03
от aizi
3 Ответов
3517 Просмотров
Последний ответ Сентябрь 09, 2010, 21:22:34
от CreatoR
13 Ответов
73611 Просмотров
Последний ответ Октябрь 17, 2010, 14:27:34
от Yashied
83 Ответов
39723 Просмотров
Последний ответ Февраль 25, 2013, 10:41:42
от Astel064
0 Ответов
3085 Просмотров
Последний ответ Октябрь 14, 2010, 11:47:43
от Garrett
0 Ответов
1985 Просмотров
Последний ответ Февраль 19, 2011, 00:08:13
от `p r o x y
1 Ответов
1839 Просмотров
Последний ответ Май 27, 2012, 12:24:28
от Garrett
0 Ответов
1248 Просмотров
Последний ответ Май 28, 2012, 22:36:03
от CreatoR
8 Ответов
2727 Просмотров
Последний ответ Ноябрь 29, 2012, 18:31:28
от AlexxxRu