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
Imagen
<--- Con este botoncito puedes reportar un mensaje a los moderadores.
Feliz Navidad y prospero año
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..
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
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?
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....
Blog técnico dedicado a la seguridad informática y al estudio de nuevas vulnerabilidades.
Blog: http://www.seginformatica.net
Twitter: https://twitter.com/#!/p0is0nseginf
Responder

Volver a “Fuentes”