Ir al contenido


Foto

Capturar en pantalla el contenido de un TForm específico.


  • Por favor identifícate para responder
3 respuestas en este tema

#1 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 14 diciembre 2011 - 11:21

Buen día, jóvenes de DelphiAccess.

Requiero saber si es posible realizar programáticamente la captura del contenido de un TForm completo (es decir, de su aspecto en un momento dado), guardarlo en un archivo temporal de imagen o en la memoria de intercambio de Windows, y así incluirla en un control aparte o mandarla vía e-mail a otro usuario.

¿Podrían indicarme si es posible éste proceso? ¿Y cómo realizarlo?

Agradeciendo de antemano.
  • 0

#2 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.947 mensajes
  • LocationMadrid - España

Escrito 14 diciembre 2011 - 06:12

No se exactamente que es lo que quieres, pero te pongo un ejemplo para copiar la imagen de un Form en un TImage, Tambien puede valer para un TBitmap...


delphi
  1. var
  2.   DC: HDC;
  3.   WRect: TRect;
  4. begin
  5.   DC:= GetWindowDC(Form1.Handle);
  6.   Windows.GetWindowRect(Form1.Handle, WRect);
  7.   Windows.StretchBlt(Image1.Canvas.Handle, 0, 0, Image1.Width, Image1.Height, DC, 0, 0, WRect.right-WRect.Left, WRect.Bottom-WRect.Top, SRCCOPY);
  8.   ReleaseDC(Form1.Handle, DC)
  9. end;



Saludos.
  • 0

#3 Pratasvenska

Pratasvenska

    Member

  • Miembros
  • PipPip
  • 38 mensajes
  • LocationSuecia

Escrito 22 septiembre 2014 - 07:14

Buenas!
Necesito hacer algo parecido... Algo asi como lo que hace cualquier programa de captura de pantalla, pero sin usar el cursor para seleccionar el area, si no que ya tengo definidos mis valores para top, left, height y width.

Uso éste código:


delphi
  1. procedure btn2Click(Sender: TObject);
  2. var
  3.   DC: HDC;
  4.   Pic: TJpegImage;
  5.   Bitmap: TBitmap;
  6.   Stream: TFileStream;
  7. begin
  8.   DC := GetDC (GetForegroundWindow) ;
  9.   try
  10.     Pic := TJpegImage.Create;
  11.     Bitmap := TBitmap.Create;
  12.     try
  13.       Bitmap.Width := GetDeviceCaps (DC, HORZRES) ;
  14.       Bitmap.Height := GetDeviceCaps (DC, VERTRES) ;
  15.  
  16.       BitBlt(Bitmap.Canvas.Handle, 0, 0, Bitmap.Width, Bitmap.Height, DC, 0, 0, SRCCOPY) ;
  17.  
  18.       Pic.Assign(Bitmap);
  19.  
  20.       Stream := TFileStream.Create('c:\temp\test.jpg', fmCreate);
  21.       try
  22.         Pic.SaveToStream(Stream);
  23.       finally
  24.         Stream.free;
  25.       end;
  26.     finally
  27.       FreeAndNil(Pic);
  28.       FreeAndNil(Bitmap);
  29.     end;
  30.   finally
  31.     ReleaseDC (GetForegroundWindow, DC) ;
  32.   end;
  33. end;



Esto guarda a un archivo jpg el contenido de la ventana actual completa, tengo entendido que en la línea


delphi
  1. BitBlt(Bitmap.Canvas.Handle, 0, 0, Bitmap.Width, Bitmap.Height, DC, 0, 0, SRCCOPY) ;


puedo hacer el "crop"? aunque cuando he cambiado los valores, no corta la imagen si no que se "llena" con espacios en blanco. O tal vez no hace lo que pienso?

Agradezco cualquier ayuda de antemano.
Saludos


escafandra editó el mensaje para agregar etiqueta delphi
  • 0

#4 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.947 mensajes
  • LocationMadrid - España

Escrito 22 septiembre 2014 - 10:06

Para capturar la pantalla con tu código, debes realizar las siguientes modificaciones (marcadas con <==):



delphi
  1. procedure btn2Click(Sender: TObject);
  2. var
  3.   DC: HDC;
  4.   Pic: TJpegImage;
  5.   Bitmap: TBitmap;
  6.   Stream: TFileStream;
  7. begin
  8.   DC := GetDC (0) ;  <==
  9.   try
  10.     Pic := TJpegImage.Create;
  11.     Bitmap := TBitmap.Create;
  12.     try
  13.       Bitmap.Width := GetDeviceCaps (DC, HORZRES) ;
  14.       Bitmap.Height := GetDeviceCaps (DC, VERTRES) ;
  15.  
  16.       BitBlt(Bitmap.Canvas.Handle, 0, 0, Bitmap.Width, Bitmap.Height, DC, 0, 0, SRCCOPY) ;
  17.  
  18.       Pic.Assign(Bitmap);
  19.  
  20.       Stream := TFileStream.Create('c:\temp\test.jpg', fmCreate);
  21.       try
  22.         Pic.SaveToStream(Stream);
  23.       finally
  24.         Stream.free;
  25.       end;
  26.     finally
  27.       FreeAndNil(Pic);
  28.       FreeAndNil(Bitmap);
  29.     end;
  30.   finally
  31.     ReleaseDC (0, DC) ;  <==
  32.   end;
  33. end;




Saludos.
  • 0