Автор Тема: _IExploreCreate запуск Internet Explorer, приватный режим и автозакрытие  (Прочитано 3211 раз)

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

Оффлайн inververs [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 2085
  • Репутация: 451
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Функция: _IExploreCreate
  • В отличие от _IECreate функция _IExploreCreate создаст объект IE с первого раза.
  • Может создавать браузер в приватном (Private) режиме
  • Может автоматически закрывать браузер после завершения скрипта.
Функция не следит за процессами, а создает работу, в которую помещает все дочерние процессы, и как только родительский завершается - работа удаляется и вместе с ней - закрывается браузер, со всеми вкладками.
Это очень удобно тем, что не нужно следить за случайно забытыми и не закрытыми окнами. Система закроет все автоматически, даже если ваш скрипт упадет с ошибкой.

Функция содержит 3 параметра: 1 - URL сайта, 2 - открывать в приватном режиме или нет, 3 - автоматически закрывать или нет.
Код: AutoIt [Выделить]
_IExploreCreate($sUrl = 'about:blank', $fInPrivate = True, $fInJob = True)

Пример:
Код: AutoIt [Выделить]
#include <WinAPIProc.au3>
#include <WinAPI.au3>

$oIe = _IExploreCreate('ya.ru')
ConsoleWrite('PID: ' & @extended & @CRLF)
MsgBox(0, '', 'Когда завершится этот скрипт, то закроется браузер' & @CRLF & 'Нажмите OK что бы завершить скрипт')
 


Примечание: Не забывайте в начале сделать #include стандартных библиотек: WinAPIProc.au3, WinAPI.au3
Примечание: В отличие от _IECreate имеет другие параметры и не ожидает загрузки страницы. Для ожидания используйте _IELoadWait

Код: AutoIt [Выделить]
#include <WinAPIProc.au3>
#include <WinAPI.au3>
; #FUNCTION# ====================================================================================================================
; Name ..........: _IExploreCreate
; Description ...: Запускает Internet Explorer. Может запускать в приватном режиме. При завершении скрипта может закрывать браузер автоматически
; Syntax ........: _IExploreCreate([$sUrl = 'about:blank'[, $fInPrivate = True[, $fInJob = True]]])
; Parameters ....: $sUrl Открыть URL                                 - [optional] A string value. Default is 'about:blank'.
;                  $fInPrivate Запустить в приватном режиме          - [optional] A boolean value. Default is True.
;                  $fInJob Закрывать браузер, при завершении скрипта - [optional] A boolean value. Default is True.
; Return values .: Успех - Возвращает объект IE, @extended - PID браузера.
;                  Ошибка - Возвращает False и устанавливает @error
;                  |1 - Не удалось выполнить _WinAPI_CreateJobObject.
;                  |2 - Не удалось выполнить _WinAPI_SetInformationJobObject
;                  |3 - Не удалось выполнить _WinAPI_CreateProcess
;                  |4 - Не удалось выполнить _WinAPI_AssignProcessToJobObject
;                  |5 - Не удалось выполнить Run
;                  |6 - Не удалось дождаться окна IE за 30 секунд
;                  |7 - Не удалось получить объект IE
; Author ........: inververs
; Remarks .......: Функция не дожидается загрузки сайта. Для этого используйте _IELoadWait
; Related .......: _IECreate
; Link ..........: http://autoit-script.ru/index.php?topic=21877.msg128341#msg128341
; Example .......: _IExploreCreate('ya.ru')
; ===============================================================================================================================
Func _IExploreCreate($sUrl = 'about:blank', $fInPrivate = True, $fInJob = True)
    ;Генерируем уникальный URL, благодаря этому мы можем найти окно с этим текстом.
    Local $url = 'about:' & Random(), $sCmd

    ;Если запускаем в приватном режиме, то добавляем соответствующие ключи.
    ;Подробнее здесь https://msdn.microsoft.com/en-us/library/hh826025(v=vs.85).aspx
    If $fInPrivate = Default Or $fInPrivate Then
        $sCmd = @ProgramFilesDir & "\Internet Explorer\iexplore.exe -noframemerging -private " & $url
    Else
        $sCmd = @ProgramFilesDir & "\Internet Explorer\iexplore.exe " & $url
    EndIf

    ;Для автоматического закрытия браузера после прекращения скрипта, создаем работу и добавляет туда дочерние процессы.
    ;https://msdn.microsoft.com/en-us/library/windows/desktop/ms684161(v=vs.85).aspx
    If $fInJob = Default Or $fInJob Then
        Local $hJob = _WinAPI_CreateJobObject()
        If Not $hJob Then Return SetError(1, 0, False)

        ;https://msdn.microsoft.com/en-us/library/windows/desktop/ms684147(v=vs.85).aspx
        Local $tInfo = DllStructCreate($tagJOBOBJECT_EXTENDED_LIMIT_INFORMATION)
        DllStructSetData($tInfo, 'LimitFlags', $JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE)

        Local Const $JobObjectExtendedLimitInformation = 9

        If Not _WinAPI_SetInformationJobObject($hJob, $JobObjectExtendedLimitInformation, $tInfo) Then
            _WinAPI_CloseHandle($hJob)
            Return SetError(2, 0, False)
        EndIf

        Local $tProcess = DllStructCreate($tagPROCESS_INFORMATION)
        Local $tStartup = DllStructCreate($tagSTARTUPINFO)

        DllStructSetData($tStartup, 'Size', DllStructGetSize($tStartup))
        ;Т.к IExplore запускает родительский процесс, который затем запускает основной браузер, то нужно родительский процесс поместить в работу поэтому приостанавливаем выполнение.
        If Not _WinAPI_CreateProcess('', $sCmd, 0, 0, 0, BitOR($CREATE_BREAKAWAY_FROM_JOB, $CREATE_SUSPENDED), 0, 0, DllStructGetPtr($tStartup), DllStructGetPtr($tProcess)) Then
            _WinAPI_CloseHandle($hJob)
            Return SetError(3, 0, False)
        EndIf

        Local $hProcess = DllStructGetData($tProcess, 'hProcess')
        ;Назначаем процесс в созданную работу
        If Not _WinAPI_AssignProcessToJobObject($hJob, $hProcess) Then
            _WinAPI_TerminateProcess($hProcess)
            _WinAPI_CloseHandle($hJob)
            Return SetError(4, 0, False)
        EndIf

        ;Процесс создан и назначен, возобновляем его работу.
        Local $hThread = DllStructGetData($tProcess, 'hThread')
        DllCall('kernel32.dll', 'dword', 'ResumeThread', 'ptr', $hThread)
        _WinAPI_CloseHandle($hThread)
    Else
        If Not Run($sCmd) Then
            Return SetError(5, 0, False)
        EndIf
    EndIf

    ;Ждем окно с уникальным текстом
    Local $hWin = WinWait("[CLASS:IEFrame]", $url, 30)
    If Not $hWin Then
        Return SetError(6, 0, False)
    EndIf

    ;Здесь мы получаем настоящий PID браузера
    Local $iPid = WinGetProcess($hWin)

    ;Здесь находим объект IE
    For $oIe In ObjCreate("Shell.Application").Windows()
        If $hWin = HWnd($oIe.hwnd) Then
            $oIe.Navigate($sUrl)
            Return SetExtended($iPid, $oIe)
        EndIf
    Next

    If $iPid Then ProcessClose($iPid)
    Return SetError(7, 0, False)
EndFunc   ;==>_IExploreCreate

« Последнее редактирование: Февраль 27, 2016, 16:00:41 от inververs »

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


 

Похожие темы

  Тема / Автор Ответов Последний ответ
11 Ответов
8295 Просмотров
Последний ответ Февраль 03, 2010, 18:41:45
от Garrett
5 Ответов
5255 Просмотров
Последний ответ Август 03, 2012, 14:15:06
от madmasles
0 Ответов
1186 Просмотров
Последний ответ Апрель 11, 2013, 17:20:37
от madmasles
9 Ответов
3469 Просмотров
Последний ответ Февраль 06, 2014, 18:31:51
от InnI
2 Ответов
1303 Просмотров
Последний ответ Август 23, 2014, 21:21:12
от darow
5 Ответов
1596 Просмотров
Последний ответ Февраль 26, 2015, 09:53:26
от inververs
2 Ответов
1472 Просмотров
Последний ответ Апрель 26, 2015, 18:38:46
от madmasles
4 Ответов
1354 Просмотров
Последний ответ Сентябрь 07, 2015, 22:36:03
от Skif_off
0 Ответов
442 Просмотров
Последний ответ Июнь 23, 2016, 08:24:30
от Нубокодер
0 Ответов
1217 Просмотров
Последний ответ Октябрь 30, 2016, 11:32:14
от inververs