Что нового

[Сеть, интернет] Скриншот выделенной области в браузере IE

sokolovska

Новичок
Сообщения
36
Репутация
0
Уже пару часов бьюсь над решением такой задачи как скриншот отдельного участка в окне IE, но я не понимаю что делать с этими координатами))

вот что пока получилось:

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

$oIE = _IECreate('http://www.1freehosting.com/register.html')
Local $o, $oColl = _IETagNameGetCollection($oIE, 'img')
$hWnd = _IEPropertyGet($oIE, 'hwnd')
For $o In $oColl
	If $o.alt = 'captcha' Then
		_IEAction($o, 'scrollIntoView')
		WinActivate(_IEPropertyGet($oIE, 'hwnd'))
		$Xpos = _IEPropertyGet($o, "screenx")
		$Ypos = _IEPropertyGet($o, "screeny")

		$iWidth = _IEPropertyGet($o, "width")
		$iHeight = _IEPropertyGet($o, "height")

        ; Я вообще не могу понять, что делать с координатами, наверно с математикой плохо!!

		$sImg = '1.jpg'
		_ScreenCapture_CaptureWnd($sImg, $hWnd, $Xpos, $Ypos, $Xpos + $iWidth, $Ypos + $iHeight)
		Sleep(600)
		ShellExecuteWait($sImg)
		_IEQuit($oIE)
		ExitLoop
	EndIf
Next
 

veretragna

Как писал, так и работает.
Сообщения
140
Репутация
10
Вот этот участок кода:
Код:
$Xpos = _IEPropertyGet($o, "screenx")
        $Ypos = _IEPropertyGet($o, "screeny")

возвращает неправильные координаты. Он возвращает координаты не относительно окна IE, а относительно начала полотна страницы.
Нужно придумать, как получить координаты относительно окна IE, придумаю - напишу дополнительно.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
sokolovska
скриншот отдельного участка в окне IE
Вариант с использованием UIAutomate

Код:
#include <IE.au3>
#include <ScreenCapture.au3>
#include "UIAutomate.au3"

$oIE = _IECreate('http://www.1freehosting.com/register.html')
$oParent = _UIA_GetElementFromHandle(ControlGetHandle("[class:IEFrame]", "", "Internet Explorer_Server1"))
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_ImageControlTypeId", "captcha")
Local $pScrollItem, $oScrollItem
$oElement.GetCurrentPattern($UIA_ScrollItemPatternId, $pScrollItem)
$oScrollItem = ObjCreateInterface($pScrollItem, $sIID_IUIAutomationScrollItemPattern, $dtagIUIAutomationScrollItemPattern)
If IsObj($oScrollItem) Then $oScrollItem.ScrollIntoView
$aRect = _UIA_ElementGetBoundingRectangle($oElement)
_ScreenCapture_Capture("1.jpg", $aRect[0], $aRect[1], $aRect[2], $aRect[3], False)
_IEQuit($oIE)
ShellExecuteWait("1.jpg")
 

veretragna

Как писал, так и работает.
Сообщения
140
Репутация
10
Решение Вашей проблемы.

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

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Opt("GUIOnEventMode", 1)

$Form1 = GUICreate("Form1", 615, 437, 192, 124)
GUISetOnEvent($GUI_EVENT_CLOSE, "_exit")
$oIE = _IECreateEmbedded()
$oBrowser = GUICtrlCreateObj($oIE, 8, 8, 600, 424)
GUISetState(@SW_SHOW)

$oIE.navigate('http://www.1freehosting.com/register.html')
Sleep(5000) ; здесь нужно использовать _IELoadWait($oIE), однако на моей системе эта функция зависает в бесконечном цикле, поэтому просто сделал паузу
Local $o, $oColl = _IETagNameGetCollection($oIE, 'img')

For $o In $oColl

    If $o.alt = 'captcha' Then
	
        _IEAction($o, 'scrollIntoView')
		
        $iWidth = _IEPropertyGet($o, "width")
        $iHeight = _IEPropertyGet($o, "height")
		
        $sImg = '1.jpg'
        _ScreenCapture_CaptureWnd($sImg, $Form1, 12, 36, $iWidth+12, $iHeight+36) ; 12 и 36 - это размер лишнего пространства между браузером и краем окна слева и сверху, просто смещаем рамку захвата чуть вправо и вниз
        ShellExecuteWait($sImg)
        
        ExitLoop
    EndIf
Next

While 1
	Sleep(1000)
WEnd

Func _Exit()
	_IEQuit($oIE)
	Exit
EndFunc
 
Верх