Что нового

[Окна, Диалоги] скриншот длинной страницы

Shinoby

Новичок
Сообщения
81
Репутация
2
Здравствуйте. Есть необходимость сделать скриншот в несколько экранов.

Подходящих решений - не нашел.

Пока в голове держу 2 варианта:
1) скриншотить постранично а затем какото их сшивать
2) "скриншотить" попиксельно с прокруткой и из этого массива формировать картинку.

возможно кто-то сталкивался с задачкой - буду признателен азимуту.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Shinoby,
Мне не совсем понятна Ваша конечная цель.
Например, мы сделали скриншоты с трех окон. Их размеры 100х150, 200х100, 230х180. Что нужно в итоге получить?
 
Автор
S

Shinoby

Новичок
Сообщения
81
Репутация
2
прошу прощения, не четко описал.
имеем страницу в браузере, которая полностью не помещается в экран и уходит ниже. нужен один скрин всей этой простыни. Такое может делать например гиперСнап, но есть желание уйти от сторонних программ.
т.е. если несколько скриншотов то примерно так будет (шир*выс) 1024*660 + 1024*660 + 1024*300
количество окон заранее не известно, размер последнего (того что не вошло в предыдущий скрин) - то же не известно.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Скриншотит http://autoit-script.ru/ в IE и сохраняет картинку в файл Test1.png

Код:
#include <IE.au3>
#include <WinAPI.au3>
#include <ScreenCapture.au3>
#include <WindowsConstants.au3>

; Runs fine with Beta 3.3.9.5+
If Int(StringReplace(@AutoItVersion, ".", "")) <= 3381 Then
    MsgBox(0, "Exit", "Requires AutoIt version > 3.3.8.1, try with Beta")
    Exit
EndIf

_WebCaptureTest("http://autoit-script.ru/", "Test1.png")

Func _WebCaptureTest($Url, $ImageName)
    Local $hBmp = _WebCapture($Url, 1280)
    _ScreenCapture_SaveImage($ImageName, $hBmp, True)
EndFunc   ;==>_WebCaptureTest

Func _WebCapture($Url, $WebWidth = 1024)

    Local $oIE = ObjCreate("Shell.Explorer.2")
    Local $hGUI = GUICreate("", $WebWidth, 768, -1, -1)
    Local $cObj = GUICtrlCreateObj($oIE, 0, 0, $WebWidth, 768)

    _IELoadWaitTimeout(20000) ; 20 sec
    _IENavigate($oIE, $Url)
    _IELoadWait($oIE)

;~ 	GUISetState()
;~ 	$oIE.Visible = True
    Local $oDocument = $oIE.document
    Local $oBody = $oIE.document.body
    Local $oHtml = $oIE.document.documentElement

    $oBody.scroll = "no"
    $oBody.style.borderStyle = "none"
    $oHtml.style.overflow = 'hidden'
    $oBody.style.overflow = 'hidden'

    Local $oIViewObject2 = ObjCreateInterface($oDocument, "{00000127-0000-0000-C000-000000000046}", "Draw hresult(dword;long;ptr;ptr;dword;dword;ptr;ptr;int;dword);")

    If @error Then Return SetError(1, 0, 0)

    Local $BodyWidth = $oBody.scrollWidth
    Local $BodyHeight = $oBody.scrollHeight
    Local $RootWidth = $oHtml.scrollWidth
    Local $RootHeight = $oHtml.scrollHeight

    Local $Width = $BodyWidth
    Local $Height = $RootHeight
    If $BodyHeight > $Height Then $Height = $BodyHeight


;~ 	ConsoleWrite($Width & @LF)
;~ 	ConsoleWrite($Height & @LF)

    $oIE.width = $Width
    $oIE.height = $Height

    Local $hDC = _WinAPI_GetDC(0)
    Local $hMemDC = _WinAPI_CreateCompatibleDC($hDC)
    Local $hBmp = _WinAPI_CreateCompatibleBitmap($hDC, $Width, $Height)
    _WinAPI_SelectObject($hMemDC, $hBmp)

    Local $sRECT = DllStructCreate($tagRECT)
    DllStructSetData($sRECT, "Top", 0)
    DllStructSetData($sRECT, "Left", 0)
    DllStructSetData($sRECT, "Right", $Width)
    DllStructSetData($sRECT, "Bottom", $Height)

    Local Const $DVASPECT_CONTENT = 1
;~     $oIViewObject2.Draw($DVASPECT_CONTENT, -1, 0, 0, Number($hDC), Number($hMemDC), Number(DllStructGetPtr($sRECT)), 0, 0, 0)

	$oIViewObject2.Draw(1, -1, 0, 0, $hDC, $hMemDC, $sRECT, 0, 0, 0)
;~ 	MsgBox(0,0,0)
    _WinAPI_DeleteDC($hMemDC)
    _WinAPI_ReleaseDC(0, $hDC)

    GUICtrlDelete($cObj)
    GUIDelete($hGUI)
    $oIViewObject2 = 0
    $oIE = 0

	Return $hBmp
EndFunc   ;==>_WebCapture
 
Автор
S

Shinoby

Новичок
Сообщения
81
Репутация
2
охох... для меня как новичка - сложновато, надо будет разобраться.
но ключевой вопрос тогда в следующем: стоит ли переходить на бету или не опытному лучше остаться на 3.3.8.1?
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Shinoby [?]
стоит ли переходить на бету или не опытному лучше остаться на 3.3.8.1?
бета версия не перепишет официальную. У вас будет 2 версии сразу устновлено. В SciTe появится новый пункт запуска, так что вы ничего не потеряете если установите бету:smile:
 
Автор
S

Shinoby

Новичок
Сообщения
81
Репутация
2
Дошли руки до этого места кода. поставил версию 3.10
и вот не задача: нужно сделать скрин активного окна браузера, которое к тому же после залогинивания.
если беру код без изменения - получаю скрин страницы логина.
если убераю открытие новой страницы и использую объект браузера (он у меня глобальный) то по ощущениям, картинка получается в размер активной страницы, но она совершенно черная. :stars:
т.е. отключаю эту строку:
Код:
Local $oIE = ObjCreate("Shell.Explorer.2")

и получаю черную картинку. причем над активной страницей производятся действия - скрол уничтожается, т.е. вроде как страница подхватывается, но изображения нет.
хелп!


Добавлено:
Сообщение автоматически объединено:

Нашел такой ответ: "
Потому что _IECreateEmbedded() это Shell.Explorer.2, а _IECreate() - InternetExplorer.Application. Это разные объекты"
Т.е. получается, что нужно както передать сеанс из одного объекта в другой... но как?
 
Верх