Что нового

Скриншот окна, работающего в полноэкранном режиме

Grell

Новичок
Сообщения
127
Репутация
0
Версия AutoIt: 3.3.14.0

Описание:
Здравствуйте.
Тут вот внезапно возник непростой вопрос, который я хотел бы задать.

У меня имеется макрос, делающий скриншот программы.
Но у него есть необычное ограничение - с теми программами, которые при открытии - тут же разворачиваются на весь экран - не получается снять скриншот.
Поскольку я не могу перехватить название окна - оно тут же раскрывается во весь экран.
А если выйти из полноэкранного режима - то это окно тут же сворачивается и поэтому АвтоитИнфо - тоже не получается на него навести.
Процесс называется heroes4.exe

Отсюда вопрос - как сделать скриншот экрана, который занимает программа - ориентируясь не на название окна, а на процесс?

Примечания:

Думал как-то приспособить имеющийся скрипт, но поскольку не могу узнать название окна - он не очень полезен.
Код:
#include <GdiPlus.au3>
#include <WindowsConstants.au3>

Opt("TrayAutoPause", 0)
Opt("WinTitleMatchMode", -2)

HotKeySet("{ESC}", "_Exit")
HotKeySet("w", "_Screen")
HotKeySet("ц", "_Screen")

While 1
    Sleep(10)
WEnd

Func _Screen()
    Local $hWnd = WinGetHandle("Total Commander")
    If Not $hWnd Then Return TrayTip("Screen", "Окно не существует", 10, 3)
    Local Static $i
    Local $iW = WinGetClientSize($hWnd)[0], $iH = WinGetClientSize($hWnd)[1], $hDC, $hMemDC, $hHBitmap, $hObj, $hBitmap
    $hDC = _WinAPI_GetDC($hWnd)
    $hMemDC = _WinAPI_CreateCompatibleDC($hDC)
    $hHBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $iW, $iH)
    $hObj = _WinAPI_SelectObject($hMemDC, $hHBitmap)
    _WinAPI_BitBlt($hMemDC, 0, 0, $iW, $iH, $hDC, 0, 0, $SRCCOPY)
    _WinAPI_SelectObject($hMemDC, $hObj)
    _WinAPI_DeleteDC($hMemDC)
    _WinAPI_ReleaseDC($hWnd, $hDC)
    _GDIPlus_Startup()
    $hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hHBitmap)
    _WinAPI_DeleteObject($hHBitmap)
    $i += 1
    _GDIPlus_ImageSaveToFile($hBitmap, @ScriptDir & "\Screen-" & $i & ".bmp")
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_Shutdown()
EndFunc   ;==>_Screen

Func _Exit()
    Exit
EndFunc   ;==>_Exit
 
Автор
G

Grell

Новичок
Сообщения
127
Репутация
0
Alofa, куда в приведенном примере - добавлять название процесса heroes4.exe ?

(В коде, приведенном в справке - непонятно куда добавлять процесс)
 
Автор
G

Grell

Новичок
Сообщения
127
Репутация
0
InnI , прошел по ссылке и изучил все приведенные там скрипты.
Скриншоты программы процесса heroes4.exe - эти скрипты не делают.

(Там видимо решали вопрос о работе PrintScreen - а у меня вопрос по снятию скриншота с программы процесса heroes4.exe )
 
Автор
G

Grell

Новичок
Сообщения
127
Репутация
0
InnI , я не понимаю при чем тут PrintScrin.
Я спрашивал не про PrintScrin.
Кнопка PrintScrin - на моем компьютере прекрасно работает. Я рукой нажимаю клавишу PrintScrin - и получаю общий скриншот - всех трех своих мониторов.

Я спрашивал не об этом, а о том, как получить скриншот программы, открытой на весь экран (экран одного монитора), у которой известно название процесса (heroes4.exe)
 
A

Alofa

Гость
Grell сказал(а):
... Там видимо решали вопрос о работе PrintScreen
Решался вопрос о скрине окна игры.

Grell сказал(а):
... известно название процесса (heroes4.exe)
Это же игра?

Вот попробуйте:
Код:
#include <WinAPIProc.au3>
#include <ScreenCapture.au3>
#include <WindowsConstants.au3>

Global $sProcess = 'TOTALCMD64.EXE'

HotKeySet('{ESC}', '_Exit')
HotKeySet('w', '_Screen')
HotKeySet('ц', '_Screen')

While Sleep(200)
WEnd

Func _Screen()
	Local $iPID, $aWinArray, $aWinArray[1][0], $aClientSize, $hDC, $hMemDC, $hHBitmap, $hObj, $hBitmap
	Local Static $i
	
	$iPID = ProcessExists($sProcess)
	If Not $iPID Then Return TrayTip('Screen', 'Процесс "' & $sProcess & '" не найден.', 10, 3)
	$aWinArray = _WinAPI_EnumProcessWindows($iPID)
	If @error Then Return TrayTip('Screen', 'Окно не существует', 10, 3)
	
	;_ArrayDisplay($aWinArray, '$aWinArray') ; <<<<<<<<<<<<<<<<<<<<<<<< П Р О В Е Р К А >>>>>>>>>>>>>>>>>>>>>>>>

	WinActivate($aWinArray[1][0])
	$aClientSize = WinGetClientSize($aWinArray[1][0])
	$hDC = _WinAPI_GetDC($aWinArray[1][0])
	$hMemDC = _WinAPI_CreateCompatibleDC($hDC)
	$hHBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $aClientSize[0], $aClientSize[1])
	$hObj = _WinAPI_SelectObject($hMemDC, $hHBitmap)
	_WinAPI_BitBlt($hMemDC, 0, 0, $aClientSize[0], $aClientSize[1], $hDC, 0, 0, $SRCCOPY)
	_WinAPI_SelectObject($hMemDC, $hObj)
	_WinAPI_DeleteDC($hMemDC)
	_WinAPI_ReleaseDC($aWinArray[1][0], $hDC)
	_GDIPlus_Startup()
	$hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hHBitmap)
	_WinAPI_DeleteObject($hHBitmap)
	$i += 1
	_GDIPlus_ImageSaveToFile($hBitmap, @ScriptDir & '\Screen-' & $i & '.bmp')
	_GDIPlus_BitmapDispose($hBitmap)
	_GDIPlus_Shutdown()
EndFunc   ;==>_Screen

Func _Exit()
	Exit
EndFunc   ;==>_Exit
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Grell [?]
и получаю общий скриншот - всех трех своих мониторов.
А окно вашей полноэкранной программы при помощи PrintScreen вы можете получить?
 
Автор
G

Grell

Новичок
Сообщения
127
Репутация
0
InnI , сейчас проверю...


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

InnI, да - скриншот я получить могу. Если во время работы этого развернутого во весь экран окна - нажму рукой на клавишу PrintScreen.
Но поскольку мониторов - три ... то получается общий скриншот.

Справа - идет изображение ТоталКоммандера, слева - собственно изображение окна heroes4.exe, а снизу - изображение браузера ГуглХром.
Вот такой гигантский скриншот.

Поэтому я и спросил - как сделать скриншот одного окна, а не общий скриншот рабочего пространства.
 
Автор
G

Grell

Новичок
Сообщения
127
Репутация
0
Alofa сказал(а):
Да. Герои меча и магии -4.

В общем заработал ваш скрипт.
Все в общем устраивает.
Так что всем, отвечавшим - спасибо за помощь.
 
Верх