Что нового

Скриншот области скрытого окна

Webarion

Осваивающий
Сообщения
143
Репутация
24
Друзья, подскажите, как сделать скриншот определённой области скрытого окна, до кода GUISetState(@SW_SHOW, $hForm)
 

eralex

Знающий
Сообщения
64
Репутация
5
Код:
Func _WinCapture($hWnd, $iWidth = -1, $iHeight = -1)
    Local $iH, $iW, $hDDC, $hCDC, $hBMP

    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)

    Return $hBMP
EndFunc
 
Автор
W

Webarion

Осваивающий
Сообщения
143
Репутация
24
Не работает без GUISetState:
Код:
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <WinApi.au3>

Local $hForm = GUICreate('', 400, 300)
GUISetBkColor(0xABCDEF)
GUICtrlCreateLabel('Привет!', 10, 10, 70, 20)
GUICtrlSetBkColor(-1, 0x00FF00)
Local $iCtrl = GUICtrlCreateLabel('', 150, 0, 130, 110, $SS_CENTERIMAGE + $SS_BITMAP)
GUICtrlSetBkColor(-1, 0xFF8000)


;~ GUISetState(@SW_SHOW, $hForm)

Local $hBmp = _WinCapture($hForm, 0, 0, 100, 80)

GUICtrlSendMsg($iCtrl, 0x0172, 0, $hBmp)

_WinAPI_DeleteObject($hBmp)


GUISetState(@SW_SHOW, $hForm)


While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case -3
            Exit
    EndSwitch
WEnd


Func _WinCapture($hWnd, $iX = 0, $iY = 0, $iW = -1, $iH = -1)
    Local $hDDC, $hCDC, $hBmp

    If $iW = -1 Then $iW = _WinAPI_GetWindowWidth($hWnd)
    If $iH = -1 Then $iH = _WinAPI_GetWindowHeight($hWnd)

    $hDDC = _WinAPI_GetDC($hWnd)
    $hCDC = _WinAPI_CreateCompatibleDC($hDDC)
    $hBmp = _WinAPI_CreateCompatibleBitmap($hDDC, $iW, $iH)
    _WinAPI_SelectObject($hCDC, $hBmp)

    DllCall("User32.dll", "int", "PrintWindow", "hwnd", $hWnd, "hwnd", $hCDC, "int", 1)

    _WinAPI_BitBlt($hCDC, 0, 0, $iW, $iH, $hDDC, $iX, $iY, $SRCCOPY)

    _WinAPI_ReleaseDC($hWnd, $hDDC)
    _WinAPI_DeleteDC($hCDC)

    Return $hBmp
EndFunc   ;==>_WinCapture
 

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
Код:
_ScreenCapture_CaptureWnd

с уточненными параметрами. разве не работает?
 
Автор
W

Webarion

Осваивающий
Сообщения
143
Репутация
24
Нет, со скрытым окном почему-то не работает.
DHj4ARP6Rv1.jpg
Мне нужно сделать снимок, до того момента, когда окно будет показано, до GUISetState()
 
Верх