Page 1 of 1

Daniel Garcia - capturar la imagen de la pantalla - win 7

PostPosted: Tue Jul 20, 2010 5:58 pm
by MGA
Ola Daniel,

Tenho uma função que usa:

ownd:SaveToBmp( cFile )

para capturar la imagen de la pantalla como lo ve el usuario.

porem no WINDOWS SEVEN (com o tema do proprio windows seven) só captura a imagem da window principal do sistema, ou seja, se eu tiver uma DIALOG aberta no WIN 7 não mostra na imagem.

se trocar o tema do windows seven para o tema classico funciona perfeitamente.

Alguma dica do que pode estar acontecendo?

Muito obrigado

Re: Daniel Garcia - capturar la imagen de la pantalla - win 7

PostPosted: Wed Jul 21, 2010 12:48 am
by Daniel Garcia-Gil
SGS

es un "problema"(?) de window por las transparencias cuando el AERO esta activado, la funcion SaveToBmp toma el DC del control que lo llama y lo convierte en Bitmap, cuando el AERO esta activado el mensajes de pintado para los controles funcionan distinto pues usan otras tecnicas de pintado para lograr transparencias, con AERO desactivado, las transparencias son "simuladas" ya que se pintan sobre el DC de la ventana los controles que estan sobre ellas ( que no son CHILD ) y asi evitar los parpadeos, puedes ver esta situacion colocando el dialogo fuera del area de la ventana prinicpal y usa SaveToBmp().
En el api de window despues se hizo la funcion PrintWindow para trabajar de forma igual con cada thema, te dejo una funcion un ejemplo que lo veas funcionando y trabaja igual en cada caso


Code: Select all  Expand view

#include "FiveWin.ch"

static oWnd, oMenu, oDlg

//----------------------------------------------------------------------------//

function main()

   DEFINE WINDOW oWnd from 1,1 TO 30,60 TITLE "Testing SaveToBmp/PrintWindow";
         MENU bldMenu()

   SET MESSAGE of oWnd to "DIALOG from HELL!!"

   ACTIVATE WINDOW oWnd

return NIL

//----------------------------------------------------------------------------//

function bldMenu()

   local oMenu

   MENU oMenu
      MENUITEM "Start dialog box" ;
        ACTION startDia()

      MENUITEM "&Exit" ;
        ACTION oWnd:end()

   ENDMENU

return oMenu


//----------------------------------------------------------------------------//

function startDia()

   local i,cVar:="lalalalala",cVar1:="hoplalalalala"

   DEFINE DIALOG oDlg FROM 1,10 TO 24,60 OF oWnd

   for i := 1 to 20
      @i,1 SAY "This is a line of text" OF oDlg
   next

   @ 1, 12 BUTTON "SaveToBmp" OF oDlg ACTION oWnd:SaveToBmp( "SaveToBmp.bmp" )
   @ 3, 12 BUTTON "Print window" OF oDlg ACTION SaveToBmp2( oWnd, "PrintWnd.bmp" )

   ACTIVATE DIALOG oDlg

return NIL

//----------------------------------------------------------------------------//

Function SaveToBmp2( oWnd, cBmpFile )
   
   local hDeskDC := GetDC( GetDesktopWindow() )
   local hDC  := CreateCompatibleDC( hDeskDC )
   local hOldBmp
   local hDib
   local hBmp
   local arect := GetWndRect( oWnd:hWnd )
   
   hBmp = CreateCompatibleBitmap( hDeskDC, arect[ 4 ] - arect[ 2 ], arect[ 3 ] - arect[ 1 ]  )

   hOldBmp = SelectObject( hDC, hBmp )
   
   PrintWindow( oWnd:hWnd, hDC )
   
   SelectObject( hDC, hOldBmp )
   DeleteDC( hDC )
   hDib = DibFromBitmap( hBmp )
   DibWrite( cBmpFile, hDib )
   GloBalFree( hDib )
   DeleteObject( hBmp )

return ( File( cBmpFile ) )
 

Re: Daniel Garcia - capturar la imagen de la pantalla - win 7

PostPosted: Wed Jul 21, 2010 5:41 pm
by MGA
Daniel,

Imagine que estou nesta dialog:

Image

aperto uma tecla que chama a funcao ownd:SaveToBmp( cFile ) e fica assim:

Image

Eu preciso que a dialog apareça.

Testei o seu exemplo e continua com o mesmo problema.

Re: Daniel Garcia - capturar la imagen de la pantalla - win 7

PostPosted: Wed Jul 21, 2010 6:35 pm
by Daniel Garcia-Gil
SGS

es que asi deberia funcionar...
se puede hacer un SaveScreen y tomara todo lo que muestre el escritorio

Code: Select all  Expand view


#include "FiveWin.ch"

#define SRCCOPY          0x00CC0020
#define SM_CXSCREEN      0
#define SM_CYSCREEN      1

static oWnd, oMenu, oDlg


//----------------------------------------------------------------------------//

function main()

   DEFINE WINDOW oWnd from 1,1 TO 30,60 TITLE "Testing SaveToBmp/PrintWindow";
         MENU bldMenu()

   SET MESSAGE of oWnd to "DIALOG from HELL!!"

   ACTIVATE WINDOW oWnd

return NIL

//----------------------------------------------------------------------------//

function bldMenu()

   local oMenu

   MENU oMenu
      MENUITEM "Start dialog box" ;
        ACTION startDia()

      MENUITEM "&Exit" ;
        ACTION oWnd:end()

   ENDMENU

return oMenu


//----------------------------------------------------------------------------//

function startDia()

   local i,cVar:="lalalalala",cVar1:="hoplalalalala"

   DEFINE DIALOG oDlg FROM 1,10 TO 24,60 OF oWnd

   for i := 1 to 20
      @i,1 SAY "This is a line of text" OF oDlg
   next

   @ 1, 12 BUTTON "SaveToBmp" OF oDlg ACTION oWnd:SaveToBmp( "SaveToBmp.bmp" )
   @ 3, 12 BUTTON "Print window" OF oDlg ACTION SaveToBmp2( oWnd, "PrintWnd.bmp" )

   ACTIVATE DIALOG oDlg

return NIL

//----------------------------------------------------------------------------//

Function SaveToBmp2( oWnd, cBmpFile )
   
   local hDeskDC := GetDC( GetDesktopWindow() )
   local hDC  := CreateCompatibleDC( hDeskDC )
   local hOldBmp
   local hDib
   local hBmp
   local nWidth := GetSysMetrics( SM_CXSCREEN )
   local nHeight := GetSysMetrics( SM_CYSCREEN )
   
     
   hBmp = CreateCompatibleBitmap( hDeskDC, nWidth, nHeight )

   hOldBmp = SelectObject( hDC, hBmp )
   
   //PrintWindow( oWnd:hWnd, hDC )
   BitBlt( hDC, 0, 0, nWidth, nHeight, hDeskDC, 0, 0, SRCCOPY )
   
   SelectObject( hDC, hOldBmp )
   DeleteDC( hDC )
   hDib = DibFromBitmap( hBmp )
   DibWrite( cBmpFile, hDib )
   GloBalFree( hDib )
   DeleteObject( hBmp )

return ( File( cBmpFile ) )
 

Re: Daniel Garcia - capturar la imagen de la pantalla - win 7

PostPosted: Wed Jul 21, 2010 7:27 pm
by MGA
Daniel,

simplesmente FANTASTICO !!!
:D :D :D :D :D :D :D :D :D :D

Muito obrigado

Re: Daniel Garcia - capturar la imagen de la pantalla - win 7

PostPosted: Fri Nov 30, 2012 7:33 am
by Andrés González
Daniel, no se si esto se ha mejorado, pero cuando ejecuto el programa el BMP que me genera sale casi todo transparente y solo veo los botones de control de la ventana, como la X de salir. Estoy buscando algo para capturar trozos de pantalla pero que el usuario pueda seleccionar lo que quiere coger, que selecciones un cuadro. Sabes como lo puedo hacer?

Andrés

Re: Daniel Garcia - capturar la imagen de la pantalla - win 7

PostPosted: Fri Nov 30, 2012 2:45 pm
by acuellar
Hola amigos


Como se hace para capturar parte del Desktop como lo hace el SAVETOBMP salvando el dialogo.

He intentado cambiando el código de Daniel
Code: Select all  Expand view

 BitBlt( hDC, aCoors[4]-300, 112, 290, 400, hDeskDC, aCoors[4]-300,112, SRCCOPY )
 


Me toma la parte, pero tambien todo el resto del Desktop en negro.

Gracias por la ayuda.

Saludos,

Adhemar