Что нового

Bitmap клиентской области эмулятора BlueStacks App Player

ArvenPK

Новичок
Сообщения
14
Репутация
1
Здравствуйте.

Помогите разобраться с вопросом, может кто сталкивался?
Не могу правильно получить bitmap клиентской области окна андроид-эмулятора BlueStacks (ссылка раз, два).
Для BlueStacks выдаёт черное окно:
Для всех остальных окон отрабатывает корректно:
Код:
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>

_main()

Func _main()
	;Создать Bitmap
	Local $hWnd = WinWait('BlueStacks App Player')
	Local $Size = WinGetClientSize($hWnd)
	Local $hDC = _WinAPI_GetDC($hWnd)
	Local $hMemDC = _WinAPI_CreateCompatibleDC($hDC)
	Local $hBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $Size[0], $Size[1])
	Local $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)

	;Создать GUI
	Local $hGUI = GUICreate("GDI+", $Size[0], $Size[1])
	GUISetState()

	;Отобразить Bitmap на форме
	_GDIPlus_Startup()
	$hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap)
	Local $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
	_GDIPlus_GraphicsDrawImage($hGraphic, $hBitmap, 0, 0)
	_GDIPlus_GraphicsDispose($hGraphic)
	_GDIPlus_BitmapDispose($hBitmap)
	_GDIPlus_Shutdown()

	Do
	Until GUIGetMsg() = $GUI_EVENT_CLOSE
EndFunc   ;==>_main
 

Вложения

  • Image 2.png
    Image 2.png
    76.8 КБ · Просмотры: 82
  • Image 3.png
    Image 3.png
    56.7 КБ · Просмотры: 85
Автор
ArvenPK

ArvenPK

Новичок
Сообщения
14
Репутация
1
Вариант получения Bitmap'а клиентской области через ScreenCapture, вместо winAPI.
Код:
#include <GDIPlus.au3>
#include <ScreenCapture.au3>

_main()

Func _main()
	Local $hWnd = WinWaitActive('BlueStacks App Player')

	Local $aWndPos = WinGetPos($hWnd)
	Local $aSize = WinGetClientSize($hWnd)
	Local $aPos[2]
	$aPos[0] = ($aWndPos[2] - $aSize[0]) / 2 ; ширина рамки
	$aPos[1] = $aWndPos[3] - $aSize[1] - $aPos[0] ; высота заголовка + меню

	;Создать Bitmap
	Local $hBitmap = _ScreenCapture_CaptureWnd("", $hWnd, $aPos[0], $aPos[1], $aPos[0] + $aSize[0], $aPos[1] + $aSize[1], False)

	;Создать GUI
	Local $hGUI = GUICreate("GDI+", $aSize[0], $aSize[1])
	GUISetState()

	;Отобразить Bitmap на форме
	_GDIPlus_Startup()
	$hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap)
	Local $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
	_GDIPlus_GraphicsDrawImage($hGraphic, $hBitmap, 0, 0)
	_GDIPlus_GraphicsDispose($hGraphic)
	_GDIPlus_BitmapDispose($hBitmap)
	_GDIPlus_Shutdown()

	Do
	Until GUIGetMsg() = -3
EndFunc   ;==>_main
И снова с нормальными окнами всё ОК, а с BlueStacks подвох:
WinGetPos для окна BlueStacks выдаёт размеры меньше реальных, и скрин получается сдвинутым.

Пока остановился на варианте - скриншот + ручное смещение. Но вопрос из первого поста остаётся открытым.
 
Верх