Что нового

Скриншот игры в полноэкранном режиме

BVPROGS

Новичок
Сообщения
5
Репутация
0
Возможно ли средствами AutoIt делать скриншот игры находящейся в полноэкранном режиме. К примеру при нажатии клавиши F12 делался скриншот экрана и сохранялся в формате jpg, желательно чтобы при этом менялся размер например с 1600х1200 на 640х480. Все примеры перепробовал, делает скриншот рабочего стола, а не игры. :stars:
 

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
Название игры!?


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

Код:
#Include <Clipboard.au3>
#Include <ScreenCapture.au3>
#Include <Misc.au3>

While 1
	Sleep(1)
	if _IsPressed('7B') Then ; Если нажать на F12 то...
		_ScreenCaptureEx(@DesktopDir&'\'&Random(0000,9999,1)&'.jpg')
	EndIf
WEnd

Func _ScreenCaptureEx($sFile, $bActiveWindow = False)
    Local $Result, $Timer, $aOld_Clip, $iFormat, $hImage, $hBitmap
    _ClipBoard_Open(0)
    Dim $aOld_Clip[_ClipBoard_CountFormats()+1][2]
    Do
        $iFormat = _ClipBoard_EnumFormats($iFormat)
        If $iFormat <> 0 Then
            $aOld_Clip[0][0] += 1
            $aOld_Clip[$aOld_Clip[0][0]][0] = _ClipBoard_GetData($iFormat)
            $aOld_Clip[$aOld_Clip[0][0]][1] = $iFormat
        EndIf
    Until $iFormat = 0
    _ClipBoard_Empty()
    _ClipBoard_Close()
    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
        Sleep(10)
    WEnd
    $hBitmap = DllCall('user32.dll', 'ptr', 'CopyImage', 'ptr', $hBitmap, 'int', 0, 'int', 0, 'int', 0, 'int', 0)
    If Not @error Then $hBitmap = $hBitmap[0]
    _ClipBoard_Open(0)
    For $i = 1 To $aOld_Clip[0][0]
        _ClipBoard_SetData($aOld_Clip[$i][0], $aOld_Clip[$i][1])
    Next
    _ClipBoard_Close()
    If Not $hBitmap Then Return 0
    If $sFile <> "" Then
        _GDIPlus_Startup()
        $hImage = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap)
        $Result = _GDIPlus_ImageSaveToFile($hImage, $sFile)
        _GDIPlus_ImageDispose($hImage)
        _GDIPlus_Shutdown()
    Else
        $Result = $hBitmap
    EndIf
    Return $Result
EndFunc
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
BVPROGS
вот этот пример из справки http://autoit-script.ru/autoit3_docs/libfunctions/_screencapture_saveimage.htm
работает. проверил. по изменению размеров можно посмотреть http://autoit-script.ru/index.php/topic,10051.msg66748.html#msg66748
что за система и какая игра?
вобщем примерно так
Код:
#include <ScreenCapture.au3>
#Include <GDIPlus.au3>

HotKeySet('^{F1}','_screen')
While 1
	Sleep(50)
	WEnd
;пример от Yashied 
Func _screen()
$hBitmap = _ScreenCapture_Capture()
_GDIPlus_Startup()
$hImage = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap)
_WinAPI_DeleteObject($hBitmap)
$hThumb = _GDIPlus_GetImageThumbnail($hImage, 640, 480)
_GDIPlus_ImageDispose($hImage)
_GDIPlus_ImageSaveToFile($hThumb, @ScriptDir & '\screenshort.jpg')
_GDIPlus_ImageDispose($hThumb)
_GDIPlus_Shutdown()
EndFunc

Func _GDIPlus_GetImageThumbnail($hImage, $iWidth, $iHeight)

    Local $Ret = DllCall($ghGDIPDll, 'int', 'GdipGetImageThumbnail', 'ptr', $hImage, 'int', $iWidth, 'int', $iHeight, 'ptr*', 0, 'ptr', 0, 'ptr', 0)

    If (@error) Or ($Ret[0]) Then
        Return SetError(1, 0, 0)
    EndIf
    Return $Ret[4]
EndFunc

под рукой была только эта игра ))))
 
Автор
B

BVPROGS

Новичок
Сообщения
5
Репутация
0
Игра Mass Effect Gold от 1С. К сожалению всё равно скриншотит только рабочий стол, а не игру. :'( Операционка Windows 7 64bit, Аэро включено.
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Попробуйте этот пример:

Код:
#include <GDIPlus.au3>
#include <WinAPIEx.au3>
#include <APIConstants.au3>

_GDIPlus_Startup()
$hBitmap = CaptureWindow(WinGetHandle('[CLASS:Solitaire]'))
_GDIPlus_ImageSaveToFile($hBitmap, @ScriptDir & "\Test.jpg")
_GDIPlus_BitmapDispose($hBitmap)
ShellExecute(@ScriptDir & "\Test.jpg")
_GDIPlus_Shutdown()

Func CaptureWindow($hWnd, $iLeft = 0, $iTop = 0, $iWidth = 0, $iHeight = 0)

    Local $hDC, $hMemDC, $hBitmap, $hMemSv, $hSrcDC, $hSrcSv, $hBmp

	Local $lWidth = _WinAPI_GetWindowWidth($hWnd)
	Local $lHeight = _WinAPI_GetWindowHeight($hWnd)

    If (($iLeft > 0) And ($iWidth = 0)) Then
		$iWidth = ($lWidth - $iLeft)
	EndIf
	If (($iTop > 0) And ($iHeight = 0)) Then
		$iHeight = ($lHeight - $iTop)
	EndIf
	If (($iLeft = 0) And ($iWidth = 0)) Then
	    $iWidth = $lWidth
	EndIf
	If (($iTop = 0) And ($iHeight = 0)) Then
	    $iHeight = $lHeight
	EndIf

    $hDC = _WinAPI_GetWindowDC($hWnd)
    $hMemDC = _WinAPI_CreateCompatibleDC($hDC)
    $hBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $lWidth, $lHeight)
    $hMemSv = _WinAPI_SelectObject($hMemDC, $hBitmap)
	_WinAPI_PrintWindow($hWnd, $hMemDC)
	_WinAPI_DeleteObject($hBitmap)
	$hSrcDC = _WinAPI_CreateCompatibleDC($hDC)
	$hBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $iWidth, $iHeight)
    $hSrcSv = _WinAPI_SelectObject($hSrcDC, $hBitmap)
	_WinAPI_BitBlt($hSrcDC, 0, 0, $iWidth, $iHeight, $hMemDC, $iLeft, $iTop, $SRCCOPY)
    _WinAPI_SelectObject($hMemDC, $hMemSv)
	_WinAPI_SelectObject($hSrcDC, $hSrcSv)
	_WinAPI_DeleteDC($hMemDC)
	_WinAPI_DeleteDC($hSrcDC)
    _WinAPI_ReleaseDC($hWnd, $hDC)
    $hBmp = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap)
    _WinAPI_DeleteObject($hBitmap)

    Return $hBmp
EndFunc
 

AZJIO

Меценат
Меценат
Сообщения
2,878
Репутация
1,194
На офсайте уже не раз говорили, если скриншот не делается с помощью Print Scrin то проблема не Autoit.
 
Автор
B

BVPROGS

Новичок
Сообщения
5
Репутация
0
Простите именно это я и спросил. Возможно ли это. С помощью AutoIT возможно практически всё, если хорошо подумать! Я никогда бы не обратился если бы не был точно не уверен. :smile: Это ответ AZJIO. Простите я не умею пользоваться форумом правильно. Он сильно изменился. :(


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

Видимо я зря напряг, это не решаемо!! Я перед тем как обратиться проштудировал весь этот форум + оффициальный, нигде решения не нашёл и тогда решился написать. (вдруг кто знает) :'(
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
BVPROGS [?]
Видимо я зря напряг, это не решаемо!!
BVPROGS, что мешает отключить Аэро и темы?. у меня на домашнем компе семерка х64. установил классическую тему и скрипт из второго поста работает на данной игре. вот скрин, сделанный с помощью скрипта
возможно стоит в скрипте добавить функцию включения классической темы, а при выходе вернуть обычную тему
вобщем попробовал просто отключить аеро и этого оказалось достаточно чтобы скрипт делал снимки игры. отключается и включается аеро командами
Код:
Net Stop uxsms
Net Start uxsms
соответственно скрипт может выглядеть примерно так ( это наспех сделано)

Код:
#include <Clipboard.au3>
#include <ScreenCapture.au3>
#include <Misc.au3>

Run(@ComSpec & " /c " & 'Net Stop uxsms', "", @SW_HIDE) ; отключаем аеро

HotKeySet('{F11}', '_out')

While 1
	Sleep(1)
	If _IsPressed('7B') Then ; Если нажать на F12 то...
		_ScreenCaptureEx(@DesktopDir & '\' & Random(0000, 9999, 1) & '.jpg')
	EndIf
WEnd

Func _out()
	Run(@ComSpec & " /c " & 'Net Start uxsms', "", @SW_HIDE); выход из программы и включение аеро
	Exit
EndFunc   ;==>_out

Func _ScreenCaptureEx($sFile, $bActiveWindow = False)
	Local $Result, $Timer, $aOld_Clip, $iFormat, $hImage, $hBitmap
	_ClipBoard_Open(0)
	Dim $aOld_Clip[_ClipBoard_CountFormats() + 1][2]
	Do
		$iFormat = _ClipBoard_EnumFormats($iFormat)
		If $iFormat <> 0 Then
			$aOld_Clip[0][0] += 1
			$aOld_Clip[$aOld_Clip[0][0]][0] = _ClipBoard_GetData($iFormat)
			$aOld_Clip[$aOld_Clip[0][0]][1] = $iFormat
		EndIf
	Until $iFormat = 0
	_ClipBoard_Empty()
	_ClipBoard_Close()
	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
		Sleep(10)
	WEnd
	$hBitmap = DllCall('user32.dll', 'ptr', 'CopyImage', 'ptr', $hBitmap, 'int', 0, 'int', 0, 'int', 0, 'int', 0)
	If Not @error Then $hBitmap = $hBitmap[0]
	_ClipBoard_Open(0)
	For $i = 1 To $aOld_Clip[0][0]
		_ClipBoard_SetData($aOld_Clip[$i][0], $aOld_Clip[$i][1])
	Next
	_ClipBoard_Close()
	If Not $hBitmap Then Return 0
	If $sFile <> "" Then
		_GDIPlus_Startup()
		$hImage = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap)
		$Result = _GDIPlus_ImageSaveToFile($hImage, $sFile)
		_GDIPlus_ImageDispose($hImage)
		_GDIPlus_Shutdown()
	Else
		$Result = $hBitmap
	EndIf
	Return $Result
EndFunc   ;==>_ScreenCaptureEx
 
Автор
B

BVPROGS

Новичок
Сообщения
5
Репутация
0
Да спасибо огромное joiner всё получилось. Всем спасибо за помощь и участие тема решена!!! :smile:
 
Верх