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

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

Postby MGA » Tue Jul 20, 2010 5:58 pm

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
ubiratanmga@gmail.com

FWH18.02
FWPPC
Harbour/xHarbour
xMate
Pelles´C
TDolphin
MGA
 
Posts: 1234
Joined: Mon Feb 25, 2008 2:54 pm
Location: Brasil/PR/Maringá

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

Postby Daniel Garcia-Gil » Wed Jul 21, 2010 12:48 am

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 ) )
 
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

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

Postby MGA » Wed Jul 21, 2010 5:41 pm

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.
ubiratanmga@gmail.com

FWH18.02
FWPPC
Harbour/xHarbour
xMate
Pelles´C
TDolphin
MGA
 
Posts: 1234
Joined: Mon Feb 25, 2008 2:54 pm
Location: Brasil/PR/Maringá

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

Postby Daniel Garcia-Gil » Wed Jul 21, 2010 6:35 pm

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 ) )
 
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

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

Postby MGA » Wed Jul 21, 2010 7:27 pm

Daniel,

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

Muito obrigado
ubiratanmga@gmail.com

FWH18.02
FWPPC
Harbour/xHarbour
xMate
Pelles´C
TDolphin
MGA
 
Posts: 1234
Joined: Mon Feb 25, 2008 2:54 pm
Location: Brasil/PR/Maringá

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

Postby Andrés González » Fri Nov 30, 2012 7:33 am

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
Saludos

Andrés González desde Mallorca
User avatar
Andrés González
 
Posts: 627
Joined: Thu Jan 19, 2006 10:45 am
Location: Mallorca

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

Postby acuellar » Fri Nov 30, 2012 2:45 pm

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
Saludos,

Adhemar C.
User avatar
acuellar
 
Posts: 1594
Joined: Tue Oct 28, 2008 6:26 pm
Location: Santa Cruz-Bolivia


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 47 guests