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

  • Май 20, 2012, 12:51:01 *
  • Добро пожаловать, Гость
Пожалуйста, войдите или зарегистрируйтесь.

Войти
Расширенный поиск  

Новости:

Вы новичок? Хотите начать изучение AutoIt и не знаете с чего начать?

Для начала ознакомьтесь с темой Быстрый старт для работы с AutoIt.
Затем осмотрите раздел Инструменты и помощь по AutoIt.

Реклама

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

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

CreatoR [?]

  • Администратор
  • *
  • *****
  • Репутация: 1399
  • Online Online
  • Пол: Мужской
  • Сообщений: 5058
  • Версия AutoIt: 3.2.8.1+
  • AutoIt is simple, subtle, elegant
    • WWW
    • Награды
НЕофициальный FAQ AutoIt
« Создано: Февраль 05, 2011, 00:47:49 »
Этот FAQ будет постепенно расти, по мере появления частых вопросов на форуме.

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



GUI и его элементы
1. Как избежать мелькание элементов GUI при их частом обновлений?
2. Как показать прокрутку только после того, когда текст выходит за рамки edit-поля?
3. Как сменить иконку у ListView Item?
4. Как правильно создавать дочерние окна?

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

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

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

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

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

Разное
1. Как установить пароль на запуск скрипта?
2. Как запустить скрипт вместе с Windows?

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

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

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

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




  Записан

CreatoR [?]

  • Администратор
  • *
  • *****

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

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




  Записан

Kaster [?]

  • Глобальный модератор
  • *
  • *****
  • Репутация: 502
  • Online Online
  • Пол: Мужской
  • Сообщений: 3286
  • Версия AutoIt: 3.3.8.1
  • Мой Аватар, он лучший самый
    • Награды
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
Как попасть на конференцию читаем тут
Файлы можете качать сюда - Файловая область
Продолжать дискуссию в теме отмеченной как "Решенная" - моветон.
Банхамером не обладаю, так что расслабьтесь ;)
Банхамером обладаю, так что не расслабляться :Ban:

`p r o x y [?]

  • Глобальный модератор
  • *
  • ****
  • Репутация: 114
  • Offline Offline
  • Пол: Мужской
  • Сообщений: 596
  • Версия AutoIt: 3.3.6.1
  • «Улыбайтесь, господа!»
    • WWW
    • Награды
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 вопрос.
Как правильно назвать свою тему – подскажут тут.
На форуме принято помечать тему «решенной» после получения ответа на свой вопрос.

CreatoR [?]

  • Администратор
  • *
  • *****

  • Автор темы
  • Репутация: 1399
  • Online Online
  • Пол: Мужской
  • Сообщений: 5058
  • Версия AutoIt: 3.2.8.1+
  • AutoIt is simple, subtle, elegant
    • WWW
    • Награды
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




  Записан

`p r o x y [?]

  • Глобальный модератор
  • *
  • ****
  • Репутация: 114
  • Offline Offline
  • Пол: Мужской
  • Сообщений: 596
  • Версия AutoIt: 3.3.6.1
  • «Улыбайтесь, господа!»
    • WWW
    • Награды
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 [?]

  • Администратор
  • *
  • *****

  • Автор темы
  • Репутация: 1399
  • Online Online
  • Пол: Мужской
  • Сообщений: 5058
  • Версия AutoIt: 3.2.8.1+
  • AutoIt is simple, subtle, elegant
    • WWW
    • Награды
Re: НЕофициальный FAQ AutoIt
« Ответ #6, Отправлен: Февраль 21, 2011, 08:04:28 »
Вопрос:
Как сменить иконку у ListView Item?

Ответ:
Тут




  Записан

`p r o x y [?]

  • Глобальный модератор
  • *
  • ****
  • Репутация: 114
  • Offline Offline
  • Пол: Мужской
  • Сообщений: 596
  • Версия AutoIt: 3.3.6.1
  • «Улыбайтесь, господа!»
    • WWW
    • Награды
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 »



  Записан

CreatoR [?]

  • Администратор
  • *
  • *****

  • Автор темы
  • Репутация: 1399
  • Online Online
  • Пол: Мужской
  • Сообщений: 5058
  • Версия AutoIt: 3.2.8.1+
  • AutoIt is simple, subtle, elegant
    • WWW
    • Награды
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)




  Записан

CreatoR [?]

  • Администратор
  • *
  • *****

  • Автор темы
  • Репутация: 1399
  • Online Online
  • Пол: Мужской
  • Сообщений: 5058
  • Версия AutoIt: 3.2.8.1+
  • AutoIt is simple, subtle, elegant
    • WWW
    • Награды
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




  Записан

CreatoR [?]

  • Администратор
  • *
  • *****

  • Автор темы
  • Репутация: 1399
  • Online Online
  • Пол: Мужской
  • Сообщений: 5058
  • Версия AutoIt: 3.2.8.1+
  • AutoIt is simple, subtle, elegant
    • WWW
    • Награды
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"




  Записан

CreatoR [?]

  • Администратор
  • *
  • *****

  • Автор темы
  • Репутация: 1399
  • Online Online
  • Пол: Мужской
  • Сообщений: 5058
  • Версия AutoIt: 3.2.8.1+
  • AutoIt is simple, subtle, elegant
    • WWW
    • Награды
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)




  Записан

CreatoR [?]

  • Администратор
  • *
  • *****

  • Автор темы
  • Репутация: 1399
  • Online Online
  • Пол: Мужской
  • Сообщений: 5058
  • Версия AutoIt: 3.2.8.1+
  • AutoIt is simple, subtle, elegant
    • WWW
    • Награды
Re: НЕофициальный FAQ AutoIt
« Ответ #12, Отправлен: Февраль 22, 2011, 14:24:12 »
Вопрос:
Как разделить/соеденить файл?

Ответ:





  Записан

CreatoR [?]

  • Администратор
  • *
  • *****

  • Автор темы
  • Репутация: 1399
  • Online Online
  • Пол: Мужской
  • Сообщений: 5058
  • Версия AutoIt: 3.2.8.1+
  • AutoIt is simple, subtle, elegant
    • WWW
    • Награды
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




  Записан

CreatoR [?]

  • Администратор
  • *
  • *****

  • Автор темы
  • Репутация: 1399
  • Online Online
  • Пол: Мужской
  • Сообщений: 5058
  • Версия AutoIt: 3.2.8.1+
  • AutoIt is simple, subtle, elegant
    • WWW
    • Награды
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




  Записан
 


Похожие темы
Тема Автор Ответов Просмотров Последний ответ
Логотипы AutoIt
Графика и творчество в рамках AutoIt
CreatoR 12 4386 Последний ответ Август 12, 2010, 22:59:59
от Waik
AutoIt на википедии
Другие проекты/ресурсы по AutoIt
CreatoR 0 2820 Последний ответ Июль 22, 2009, 05:50:15
от CreatoR
 Закреплено  Официальный FAQ AutoIt
AutoIt для новичков
El Panda 16 16522 Последний ответ Сентябрь 15, 2009, 15:41:00
от El Panda
AutoIt Path Switcher - Переключение пути к папке AutoIt
Примеры и рабочие проекты
CreatoR 16 6261 Последний ответ Октябрь 16, 2010, 17:53:08
от CreatoR
Как заставить hotkeys для AutoIt работать только внутри GUI AutoIt?
AutoIt для новичков
Suppir 2 3544 Последний ответ Ноябрь 16, 2009, 09:13:26
от Suppir
Graphical AutoIt Debugger - Графический отладчик для AutoIt
Инструменты и помощь по AutoIt
CreatoR 13 7393 Последний ответ Август 27, 2011, 20:09:15
от Nero21
PHP и Autoit
AutoIt для новичков
planetasov 15 2697 Последний ответ Май 01, 2012, 22:32:34
от running-frag
Autoit на IE
AutoIt для новичков
crank 17 3462 Последний ответ Август 30, 2010, 19:08:34
от Guezt Gutsy
День тестировщика (неофициальный праздник)
Общение
Garrett 3 1014 Последний ответ Сентябрь 09, 2010, 21:22:34
от CreatoR
[Обсуждение] Русское сообщество AutoIt сливается с официальным проектом AutoIt
Общение
Viktor1703 30 596 Последний ответ Апрель 02, 2012, 03:44:53
от Garrett


Реклама

* Последние сообщения на форуме
post Re: [Мышь, клавиатура] Привязка клика по координатам к клавише
[Стол заказов] megatoxx Сегодня в 12:41:37
post Re: Защита исходного кода программы
[AutoIt для новичков] iamOmg Сегодня в 12:35:14
post Re: Защита исходного кода программы
[AutoIt для новичков] Ganibal95 Сегодня в 12:34:22
post Re: Защита исходного кода программы
[AutoIt для новичков] iamOmg Сегодня в 12:33:22
post Re: Защита исходного кода программы
[AutoIt для новичков] Ganibal95 Сегодня в 12:21:05
post Re: Проблема с циклами While
[AutoIt для новичков] Yashied Сегодня в 12:14:25
post Сглаживание рывков при передачи новых координат игрока по TCP/IP
[Общение] Ganibal95 Сегодня в 12:10:37
post Перенесено: Уроки программирования и автоматизации посредством AutoIt для чайников
[AutoIt для новичков] Yashied Сегодня в 12:09:28
post Re: Защита исходного кода программы
[AutoIt для новичков] iamOmg Сегодня в 12:09:05
post Проблема с циклами While
[AutoIt для новичков] Andeangl Сегодня в 11:03:15

* Пользователи онлайн
  • Dot Гостей: 107
  • Dot Скрыт: 2
  • Dot Пользователей: 29
  • Dot Пользователи Online: