Автор Тема: _IE_Capture скриншот документа Internet Explorer с прокруткой  (Прочитано 759 раз)

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

Оффлайн inververs [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 2004
  • Репутация: 439
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
AutoIt: 3.3.10.0 или новее.
(нажмите для показа/скрытия)

Категория: Автоматизация, Вспомогательные функции, GDI+, Интернет, IE

Описание: Функция _IE_Capture делает скриншот всего документа браузера Internet Explorer.
Документ прокручивается сверху вниз, делается скриншот текущей области. В конце все кусочки склеиваются в одно изображение.
Во время прокрутки окно должно быть видимым, не перекрытым другими окнами. Если окно - это вкладка, то она должна быть активной. Если на странице есть фиксированные элементы, то они будут дублироваться на снимке, поэтому перед началом, такие элементы делайте скрытыми.

Зависимости:
Код: AutoIt [Выделить]
#include <ScreenCapture.au3>


Код:
Код: AutoIt [Выделить]
#include <ScreenCapture.au3>
; #FUNCTION# ====================================================================================================================
; Name ..........: _IE_Capture
; Description ...: IE Browser document screen shoot with scroll
; Description ...: Скриншот документа браузера с прокруткой. Только документ, без заголовка окна и панелей
; Syntax ........: _IE_Capture($oIe, $sImageFile[, $iMaxWidth = Default[, $fSetOnTop = Default[, $iScrollDelay = Default]]])
; Parameters ....: $oIe                 - Объект браузера IE возвращаемый функцией _IECreate или _IEAttach.
;                  $sImageFile          - Имя файла куда будет сделан скриншот. Если не указано, возвращает hImage, не забудьте освободить его через _GDIPlus_BitmapDispose
;                  $iMaxWidth           - [optional] An integer value. Default is Default. Установить ширину окна, по умолчанию - максимальная ширина документа
;                  $iScrollDelay        - [optional] An integer value. Default is Default. Пауза после прокрутки. По умолчания 250. Увеличьте значение если будут артефакты.
; Return values .: $sImageFile|hImage - если выполнено без ошибок.
;                  False - если выполнено с ошибками.
;                : Устанавливаются следующие коды ошибок:
;                : @error: 0 - выполенно без ошибок
;                : @error: 1 - $oIe не объект
;                : @error: 2 - Не получен hwnd окна браузера
;                : @error: 3 - Не получен Internet Explorer_Server контрол.
;                : @error: 4 - Не получен объект document.
; Author ........: inververs
; Remarks .......: Элементы с position=fixed будут повторяться. Окно с документом должно быть видимым, вкладка должна быть активной.
; Related .......: _IECreate
; Link ..........:
; Example .......:  #include <ie.au3>
;                   ShellExecute(_IE_Capture(_IECreate('https://yandex.ru/'), @ScriptDir & '\test.jpg'))
; ===============================================================================================================================
Func _IE_Capture($oIe, $sImageFile = Default, $iMaxWidth = Default, $iScrollDelay = Default)
    Local Const $iWidthPlusNoScroll = 34

    If Not IsObj($oIe) Then
        Return SetError(1, 0, False)
    EndIf

    Local $hWnd = HWnd($oIe.hwnd)
    If Not IsHWnd($hWnd) Then
        Return SetError(2, 0, False)
    EndIf

    Local $hControl = ControlGetHandle($hWnd, '', '[CLASS:Internet Explorer_Server; INSTANCE:1]')
    If Not IsHWnd($hControl) Then
        Return SetError(3, 0, False)
    EndIf

    Local $oDocument = $oIe.document
    If @error Or Not IsObj($oDocument) Then
        Return SetError(4, 0, False)
    EndIf

    If $iScrollDelay = Default Then
        $iScrollDelay = 250
    EndIf

    WinActivate($hWnd)
    WinWaitActive($hWnd)

    If $iMaxWidth = Default Then
        $iMaxWidth = 0
        Local $aWidth = [ _
                $oDocument.body.scrollWidth, $oDocument.documentElement.scrollWidth, _
                $oDocument.body.offsetWidth, $oDocument.documentElement.offsetWidth, _
                $oDocument.body.clientWidth, $oDocument.documentElement.clientWidth]
        For $iClientWidthidth In $aWidth
            If $iClientWidthidth > $iMaxWidth Then $iMaxWidth = $iClientWidthidth
        Next
        WinMove($hWnd, '', Default, Default, $iMaxWidth + $iWidthPlusNoScroll)
    ElseIf $iMaxWidth > 0 Then
        WinMove($hWnd, '', Default, Default, $iMaxWidth)
    EndIf

    Local $aPos = ControlGetPos($hWnd, '', $hControl)
    ReDim $aPos[4]

    Local $iClientWidth = $aPos[2]
    Local $iClientHeight = $aPos[3]

    $oDocument.body.scroll = "no"
    $oDocument.parentwindow.scrollTo(0, 0)
    Sleep($iScrollDelay)

    Local $iMaxHeight = 0
    Local $aHeight = [ _
            $oDocument.body.scrollHeight, $oDocument.documentElement.scrollHeight, _
            $oDocument.body.offsetHeight, $oDocument.documentElement.offsetHeight, _
            $oDocument.body.clientHeight, $oDocument.documentElement.clientHeight]
    For $iHeight In $aHeight
        If $iHeight > $iMaxHeight Then $iMaxHeight = $iHeight
    Next

    Local $iScrollCount = Ceiling($iMaxHeight / $iClientHeight)

    _GDIPlus_Startup()
    Local $hImage = _GDIPlus_BitmapCreateFromScan0($iClientWidth, $iMaxHeight)
    Local $hGraphics = _GDIPlus_ImageGetGraphicsContext($hImage)
    Local $iTop, $hBitmap, $hImage2

    For $i = 0 To $iScrollCount - 1
        $iTop = $i * $iClientHeight - $oDocument.documentElement.scrollTop
        $hBitmap = _ScreenCapture_CaptureWnd('', $hControl, 0, $iTop, -1, -1, False)
        $hImage2 = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap)
        _WinAPI_DeleteObject($hBitmap)
        _GDIPlus_GraphicsDrawImage($hGraphics, $hImage2, 0, $i * $iClientHeight)
        _GDIPlus_BitmapDispose($hImage2)
        $oDocument.parentwindow.scrollBy(0, $iClientHeight)
        Sleep($iScrollDelay)
    Next

    $oDocument.body.scroll = "yes"

    _GDIPlus_GraphicsDispose($hGraphics)

    Local $vReturn
    If $sImageFile = Default Or Not $sImageFile Then
        $vReturn = $hImage
    Else
        _GDIPlus_ImageSaveToFile($hImage, $sImageFile)
        _GDIPlus_BitmapDispose($hImage)
        $vReturn = $sImageFile
    EndIf
    _GDIPlus_Shutdown()

    Return $vReturn
EndFunc
 


Пример:
Код: AutoIt [Выделить]
#include <ScreenCapture.au3>
#include <ie.au3>
ShellExecute(_IE_Capture(_IECreate('https://ru.wikipedia.org/wiki/'), @ScriptDir & '\test2.jpg'))


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

Источник: autoit-script.ru
Автор(ы): inververs

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

_IE_Capture скриншот документа Internet Explorer с прокруткой
« Отправлен: Октябрь 30, 2016, 11:32:14 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
11 Ответов
8123 Просмотров
Последний ответ Февраль 03, 2010, 18:41:45
от Garrett
4 Ответов
3789 Просмотров
Последний ответ Апрель 30, 2012, 21:29:03
от systel
0 Ответов
1162 Просмотров
Последний ответ Апрель 11, 2013, 17:20:37
от madmasles
9 Ответов
3243 Просмотров
Последний ответ Февраль 06, 2014, 18:31:51
от InnI
2 Ответов
1152 Просмотров
Последний ответ Август 23, 2014, 21:21:12
от darow
5 Ответов
1491 Просмотров
Последний ответ Февраль 26, 2015, 09:53:26
от inververs
2 Ответов
1061 Просмотров
Последний ответ Апрель 14, 2015, 19:10:47
от CreatoR
2 Ответов
1417 Просмотров
Последний ответ Апрель 26, 2015, 18:38:46
от madmasles
8 Ответов
1574 Просмотров
Последний ответ Июль 26, 2015, 20:58:16
от DanSaratov
3 Ответов
1211 Просмотров
Последний ответ Октябрь 08, 2015, 14:18:33
от Garrett