Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Как сделать скриншот скрытого окна? (http://forum.oszone.net/showthread.php?t=201712)

centaurvv 11-03-2011 15:05 1632404

Как сделать скриншот скрытого окна?
 
Собственно, тема раскрывает основной вопрос. Скриншот видимого окна сделать возможно, а скрытого... думаю тоже, но как это сделать (кроме варианта сделать его видимым на долю секунды для снимка)?
В подтверждение добавлю такой пример:

Код:

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <IE.au3>
#Include <ScreenCapture.au3>

$oIE = _IECreateEmbedded ()
$hGui = GUICreate("", 1000, 500,-1, -1)

GUICtrlCreateObj($oIE, 0, 0, 990, 490)
_IENavigate ($oIE, 'http://www.mail.ru')
GUISetState()                                                            ;Окно открыто
_ScreenCapture_CaptureWnd (@DesktopDir & "\Окно_не_скрыто.jpg", $hGui)    ;Делаю скриншот и сохраняю на рабочий стол "Окно_не_скрыто.jpg"
GUISetState(@SW_HIDE)                                                    ;Скрываю окно
_ScreenCapture_CaptureWnd (@DesktopDir & "\Окно_скрыто.jpg", $hGui)        ;Делаю скриншот и сохраняю на рабочий стол "Окно_скрыто.jpg"
GUISetState()


While GUIGetMsg() <> $GUI_EVENT_CLOSE
WEnd


kaster 11-03-2011 16:08 1632452

по моему, можно подвинуть окно за пределы экрана (координаты окна превосходящие разрешение монитора) и сделать снимок по хендлу. проверь, может поможет

Creat0R 11-03-2011 19:00 1632606

Код:

#include <IE.au3>
#include <WinAPI.au3>
#Include <ScreenCapture.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$oIE = _IECreateEmbedded()
$hGui = GUICreate("", 1000, 500,-1, -1)

GUICtrlCreateObj($oIE, 0, 0, 990, 490)
_IENavigate($oIE, 'http://www.mail.ru')

GUISetState()                                                                  ;Окно открыто
_ScreenCapture_CaptureBackgrWnd(@DesktopDir & "\Окно_не_скрыто.jpg", $hGui)    ;Делаю скриншот и сохраняю на рабочий стол "Окно_не_скрыто.jpg"
GUISetState(@SW_HIDE)                                                          ;Скрываю окно
_ScreenCapture_CaptureBackgrWnd(@DesktopDir & "\Окно_скрыто.jpg", $hGui)      ;Делаю скриншот и сохраняю на рабочий стол "Окно_скрыто.jpg"
GUISetState()

While GUIGetMsg() <> $GUI_EVENT_CLOSE
WEnd

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


centaurvv 13-03-2011 16:26 1633910

Цитата:

Цитата kaster
по моему, можно подвинуть окно за пределы экрана »

к сожалению не проходит такой вариант... хотя идея"улыбает" своей простотой :)

Цитата:

Цитата Creat0R
Сделай так просто, как возможно, но не проще этого »

Как всегда все работает безупречно! Спасибо!
Осталось разобраться в работе кода... WinAPI+DLL пока немного сложны для понимания :(

Creat0R 13-03-2011 23:40 1634221

Цитата:

Цитата centaurvv
к сожалению не проходит такой вариант »

Цитата:

Цитата centaurvv
Как всегда все работает безупречно! »

Этот вариант используется в моём коде ;)

kaster 14-03-2011 00:55 1634262

Цитата:

Цитата centaurvv
к сожалению не проходит такой вариант... хотя идея"улыбает" своей простотой »

Цитата:

Цитата Creat0R
Этот вариант используется в моём коде »

centaurvv,

centaurvv 14-03-2011 05:14 1634312

:) я пробовал подвинуть окно за пределы экрана в своем коде - результат не удовлетворил, по поводу кода Creat0R я уже писал :), что далек от WinAPI+DLL.
Тогда спасибо обоим за помощь ;)


Время: 07:07.

Время: 07:07.
© OSzone.net 2001-