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.
Capturar en pantalla el contenido de un TForm específico.
Comenzado por
TiammatMX
, dic 14 2011 11:21
3 respuestas en este tema
#1
Escrito 14 diciembre 2011 - 11:21
#2
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
var DC: HDC; WRect: TRect; begin DC:= GetWindowDC(Form1.Handle); Windows.GetWindowRect(Form1.Handle, WRect); Windows.StretchBlt(Image1.Canvas.Handle, 0, 0, Image1.Width, Image1.Height, DC, 0, 0, WRect.right-WRect.Left, WRect.Bottom-WRect.Top, SRCCOPY); ReleaseDC(Form1.Handle, DC) end;
Saludos.
#3
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:
Esto guarda a un archivo jpg el contenido de la ventana actual completa, tengo entendido que en la línea
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
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
procedure btn2Click(Sender: TObject); var DC: HDC; Pic: TJpegImage; Bitmap: TBitmap; Stream: TFileStream; begin DC := GetDC (GetForegroundWindow) ; try Pic := TJpegImage.Create; Bitmap := TBitmap.Create; try Bitmap.Width := GetDeviceCaps (DC, HORZRES) ; Bitmap.Height := GetDeviceCaps (DC, VERTRES) ; BitBlt(Bitmap.Canvas.Handle, 0, 0, Bitmap.Width, Bitmap.Height, DC, 0, 0, SRCCOPY) ; Pic.Assign(Bitmap); Stream := TFileStream.Create('c:\temp\test.jpg', fmCreate); try Pic.SaveToStream(Stream); finally Stream.free; end; finally FreeAndNil(Pic); FreeAndNil(Bitmap); end; finally ReleaseDC (GetForegroundWindow, DC) ; end; end;
Esto guarda a un archivo jpg el contenido de la ventana actual completa, tengo entendido que en la línea
delphi
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
#4
Escrito 22 septiembre 2014 - 10:06
Para capturar la pantalla con tu código, debes realizar las siguientes modificaciones (marcadas con <==):
Saludos.
delphi
procedure btn2Click(Sender: TObject); var DC: HDC; Pic: TJpegImage; Bitmap: TBitmap; Stream: TFileStream; begin DC := GetDC (0) ; <== try Pic := TJpegImage.Create; Bitmap := TBitmap.Create; try Bitmap.Width := GetDeviceCaps (DC, HORZRES) ; Bitmap.Height := GetDeviceCaps (DC, VERTRES) ; BitBlt(Bitmap.Canvas.Handle, 0, 0, Bitmap.Width, Bitmap.Height, DC, 0, 0, SRCCOPY) ; Pic.Assign(Bitmap); Stream := TFileStream.Create('c:\temp\test.jpg', fmCreate); try Pic.SaveToStream(Stream); finally Stream.free; end; finally FreeAndNil(Pic); FreeAndNil(Bitmap); end; finally ReleaseDC (0, DC) ; <== end; end;
Saludos.