Что нового

_IE_Capture скриншот документа Internet Explorer с прокруткой

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
AutoIt: 3.3.10.0 или новее.
Не рекомендую версии не проходящие проверку OK здесь

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

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

Зависимости:
Код:
#include <ScreenCapture.au3>


Код:
Код:
#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


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


Примеры скриншотов:
test2.jpg
test.jpg

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