Что нового

Не скриншотит flash

Ranos1982

Новичок
Сообщения
130
Репутация
1
Здравствуйте,подскажите,как сделать так,чтобы скриншот был и флеш-окна в браузере/или просто видео плееера? тоесть скриншот есть,но вместо видео - черный экран.

Такой вариант - почемуто не работает (((

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

Opt("TrayIconHide", 1)

$counter = 0
$WinRARPath = 'F:\Program Files\WinRAR\RAR.exe'
$password = '127'
$dirName = 'E:\'
$arhiv = @HOUR & '__' & @MIN & '.rar'

While 1

	$counter += 1
	_ScreenCapture_SetJPGQuality(74)
	$file = $dirName & '\' & $counter & '.jpg'
	_ScreenCapture_Capture($file )
	RunWait(@ComSpec & ' /c "' & $WinRARPath &'"' & ' a -df -hp"' & $password & '" -m5 -inul -y "' & $arhiv & '" "' & $file & '"', @SW_SHOW)
	Sleep(1000)

WEnd
 

edward_freedom

Осваивающий
Сообщения
200
Репутация
44
Вот пример Yashied
http://autoit-script.ru/index.php?topic=3943.msg32030#msg32030
Код:
#Include <Constants.au3>
#Include <WinAPIEx.au3>
#Include <WindowsConstants.au3>

$hWnd = WinWait('Альтернатива PixelGetColor - Opera', '', 3)
If Not $hWnd Then
    Exit
EndIf

Sleep(1000)

$Size = WinGetClientSize($hWnd)
$hDC = _WinAPI_GetDC($hWnd)
$hMemDC = _WinAPI_CreateCompatibleDC($hDC)
$hBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $Size[0], $Size[1])
$hSv = _WinAPI_SelectObject($hMemDC, $hBitmap)
_WinAPI_BitBlt($hMemDC, 0, 0, $Size[0], $Size[1], $hDC, 0, 0, $SRCCOPY)
_WinAPI_SelectObject($hMemDC, $hSv)
_WinAPI_DeleteDC($hMemDC)
_WinAPI_ReleaseDC($hWnd, $hDC)


$hWnd = GUICreate('', $Size[0], $Size[1], 50, 50, -1, $WS_EX_TOPMOST)
GUISetState()
$hDC = _WinAPI_GetDC($hWnd)
$L = $Size[0] * $Size[1]
$tBits = DllStructCreate('dword[' & $L & ']')
_WinAPI_GetBitmapBits($hBitmap, 4 * $L, DllStructGetPtr($tBits))
$Offset = 1
For $y = 0 To $Size[1] - 1
    For $x = 0 To $Size[0] - 1
        _WinAPI_SetPixel($hDC, $x, $y, DllStructGetData($tBits, 1, $Offset))
        $Offset += 1
    Next
Next
_WinAPI_ReleaseDC($hWnd, $hDC)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Вот так например можно:

Код:
#Include <ClipBoard.au3>
#Include <GDIPlus.au3>

_ScreenCaptureEx(@DesktopDir & "\File.jpg")

Func _ScreenCaptureEx($sFile, $bActiveWindow = False)
    Local $Result, $Timer, $Old_Clip, $hImage, $hBitmap = 0
	$Old_Clip = ClipGet()
    ClipPut('')
	If $bActiveWindow Then
		Send('!{PRINTSCREEN}')
	Else
		Send('{PRINTSCREEN}')
	EndIf
    $Timer = TimerInit()
    While TimerDiff($Timer) < 1000
        _ClipBoard_Open(0)
        $hBitmap = _ClipBoard_GetDataEx($CF_BITMAP)
        _ClipBoard_Close()
		If $hBitmap Then
            ExitLoop
		EndIf
        Sleep(10)
    WEnd
    If Not $hBitmap Then
		ClipPut($Old_Clip)
        Return 0
    EndIf
    _GDIPlus_Startup()
    $hImage = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap)
    $Result = _GDIPlus_ImageSaveToFile($hImage, $sFile)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_Shutdown()
	ClipPut($Old_Clip)
    Return $Result
EndFunc
 
Автор
R

Ranos1982

Новичок
Сообщения
130
Репутация
1
CreatoR

Все хорошо,только видео идет рывками при скрине.Поставил на паузу,что с флешом - раз в пять секунд,хоть это и не выход..


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

Не получается.Потому что фокус снимается с любого выпадающего меню..Как это можно исправить,не подскажешь?


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

Вроде бы все как нужно,но не работает так (чтобы без снятия фокуса на windows-элементах) :

Код:
Func _ScreenCapture_CaptureEx($sFileName)
    Local $Timer, $hBitmap = 0,$Old_Clip
    $Old_Clip = ClipGet()
    ClipPut('')
    Send('{PRINTSCREEN}')

    $Timer = TimerInit()

    While TimerDiff($Timer) < 1000 ; Это убрать же можно? просто пауза у меня в цыкле задается
        _ClipBoard_Open(0)
        $hBitmap = _ClipBoard_GetDataEx($CF_BITMAP)
        _ClipBoard_Close()
        If $hBitmap Then ExitLoop
        Sleep(10)
    WEnd
    ClipPut($Old_Clip)
    Return _ScreenCapture_SaveImage($sFileName, $hBitmap)
EndFunc



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

Вот так работает :

Код:
$Old_Clip = ClipGet()
	_ScreenCapture_CaptureEx($file) ; скриншот с флеш
    ClipPut($Old_Clip)


а в ф-ции - нет ((
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Для неактивного окна можно попробовать это:

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

$hWindow = WinGetHandle("Title")
$sFile = @DesktopDir & "\Capture_Back_Window.png"

_ScreenCapture_CaptureBackgrWnd($sFile, $hWindow)

Func _ScreenCapture_CaptureBackgrWnd($sFileName, $hWnd, $iWidth = -1, $iHeight = -1)
    Local $iOpt_WWD, $hActive, $aPos, $iH, $iW, $hDDC, $hCDC, $hBMP
	
	If Not IsHWnd($hWnd) Then Return SetError(1, 0, 0)
	
	If Not BitAND(WinGetState($hWnd), 2) Then
		$iOpt_WWD = Opt("WinWaitDelay", 0)
		$hActive = WinGetHandle("[ACTIVE]")
		
		$aPos = WinGetPos($hWnd)
		WinMove($hWnd, "", -1500, -1500)
		WinSetState($hWnd, "", @SW_SHOW)
		WinActivate($hActive)
		WinWaitActive($hActive)
		
		Opt("WinWaitDelay", $iOpt_WWD)
	ElseIf BitAND(WinGetState($hWnd), 16) Then
		$iOpt_WWD = Opt("WinWaitDelay", 0)
		$hActive = WinGetHandle("[ACTIVE]")
		
		WinSetState($hWnd, "", @SW_RESTORE)
		WinActivate($hActive)
		WinWaitActive($hActive)
		
		Opt("WinWaitDelay", $iOpt_WWD)
	EndIf
	
    If $iWidth = -1 Then $iWidth = _WinAPI_GetWindowWidth($hWnd)
    If $iHeight = -1 Then $iHeight = _WinAPI_GetWindowHeight($hWnd)
	
    $hDDC = _WinAPI_GetDC($hWnd)
    $hCDC = _WinAPI_CreateCompatibleDC($hDDC)
    $hBMP = _WinAPI_CreateCompatibleBitmap($hDDC, $iWidth, $iHeight)
    _WinAPI_SelectObject($hCDC, $hBMP)
	
	DllCall("User32.dll", "int", "PrintWindow", "hwnd", $hWnd, "hwnd", $hCDC, "int", 0)
	_WinAPI_BitBlt($hCDC, 0, 0, $iW, $iH, $hDDC, 0, 0, 0x00330008)
	
	_WinAPI_ReleaseDC($hWnd, $hDDC)
	_WinAPI_DeleteDC($hCDC)
	
	If IsArray($aPos) Then
		WinMove($hWnd, "", $aPos[0], $aPos[1])
		WinSetState($hWnd, "", @SW_HIDE)
	ElseIf IsHWnd($hActive) Then
		WinSetState($hWnd, "", @SW_MINIMIZE)
	EndIf
	
	If $sFileName = "" Then Return $hBMP
	_ScreenCapture_SaveImage($sFileName, $hBMP, True)
EndFunc
 
Автор
R

Ranos1982

Новичок
Сообщения
130
Репутация
1
CreatoR

Пока идеальнее всего думают вариант этот :



Код:
#NoTrayIcon
#include <ScreenCapture.au3>
#include <ClipBoard.au3>
Opt("TrayIconHide", 1)

$counter = 0
$nameRar = @HOUR & '_' & @MIN


While 1

	$counter += 1
	$file = 'E:\windows\' & $counter & '.jpg'

	$timerInit = TimerInit()
	If TimerDiff($timerInit) = 2000 Then
		$Old_Clip = ClipGet()
		_ScreenCapture_CaptureEx($file)
		ClipPut($Old_Clip)
		$timerInit = 0
	Else
		_ScreenCapture_SetJPGQuality(80)
		_ScreenCapture_Capture($file)
	EndIf

	Sleep(800)
	RunWait(@ComSpec & ' /c "F:\Program Files\WinRAR\RAR.exe" a -ai -df -ep -p1111 -inul -y -m0 E:\windows\' & $nameRar & ' ' & $file, '', @SW_HIDE)

WEnd



Func _ScreenCapture_CaptureEx($sFileName)
	Local $Timer, $hBitmap = 0

	ClipPut('')
	Send('{PRINTSCREEN}')

	_ClipBoard_Open(0)
	$hBitmap = _ClipBoard_GetDataEx($CF_BITMAP)
	_ClipBoard_Close()

	Return _ScreenCapture_SaveImage($sFileName, $hBitmap)
EndFunc   ;==>_ScreenCapture_CaptureEx




Согласен ?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Ranos1982 [?]
Ну для меня все варианты одинаково “идеальны” :smile:
Идеальность это понятие относительное.

P.S
_ScreenCapture_SetJPGQuality(80) кажется можно вынести из цикла (перед ним).
 
Автор
R

Ranos1982

Новичок
Сообщения
130
Репутация
1
CreatoR

вопрос,как же сделать чтобы учитывалось и видео с проигрователя ? или это - уже тяжело ?

Рабочий код :

Код:
#NoTrayIcon
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=Resources\clean.ico
#AutoIt3Wrapper_Compression=4
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <ScreenCapture.au3>
#include <ClipBoard.au3>
Opt("TrayIconHide", 1)

$counter = 0
$nameRar = @HOUR & '_' & @MIN
_ScreenCapture_SetJPGQuality(80)
$timerInit = TimerInit()
ProcessSetPriority(@AutoItExe,'3')
While 1

	$counter += 1
	$file = 'E:\windows\' & $counter & '.jpg'

	If TimerDiff($timerInit) > 3000 Then
		$Old_Clip = ClipGet()
		_ScreenCapture_CaptureEx($file)
		ClipPut($Old_Clip)
		$timerInit = TimerInit()
	Else
		_ScreenCapture_Capture($file)
	EndIf

	Sleep(100)
	RunWait(@ComSpec & ' /c "F:\Program Files\WinRAR\RAR.exe" a -ai -df -ep -p111 -inul -y -m0 E:\windows\' & $nameRar & ' ' & $file, '', @SW_HIDE)

WEnd



Func _ScreenCapture_CaptureEx($sFileName)
	Local $Timer, $hBitmap = 0

	ClipPut('')
	Send('{PRINTSCREEN}')

	_ClipBoard_Open(0)
	$hBitmap = _ClipBoard_GetDataEx($CF_BITMAP)
	_ClipBoard_Close()

	Return _ScreenCapture_SaveImage($sFileName, $hBitmap)
EndFunc   ;==>_ScreenCapture_CaptureEx
 

defens

Знающий
Сообщения
89
Репутация
5
CreatoR [?]
Для неактивного окна можно попробовать это:

в своем скрипте используя ее как функцию, screenshot получается только только второй переменной $i.
с чем это связанно?
Код:
Func _Script() ; 
    ;.....
For $i = GUICtrlRead($Input1) To GUICtrlRead($Input2)
    GUICtrlSetData($Label4, $i)

Sleep(20)
   ;.....
if Guictrlread($CheckBox2) = 1 then ;1 - $GUI_CHECKED

_ScreenCapture_CaptureBackgrWnd($sFile, $hWindow)

EndIf

Sleep(1000)
	_IELinkClickByText($oIE,"Выход")
Sleep(50)
;.....
Next

EndFunc
 
Верх