Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Redes (https://www.clubdelphi.com/foros/forumdisplay.php?f=37)
-   -   Tomar pantalla de clientes (https://www.clubdelphi.com/foros/showthread.php?t=68742)

adeszeus 03-07-2010 22:03:11

Tomar pantalla de clientes
 
Buenas tardes ando buscando la manera de recibir impresiones de pantalla de los clientes de mi red, llevo dias buscando con indy 10 pero levanto el servidor y quiero reenviar mensajes y me marca k el socket esta ocupado... despues cheque unos ejemplos con sockets y el problema radica en que lo necesito para estar monitoreando y consume bastantes recursos el hecho de tomar la pantalla, ademas de tiempo de espera... y para colmo si esta ocupado mi proceso en las demas pc's me marca errorde que el socket esta ocupado, ando navegando y sin encontrar alguna respuesta, alguien me puede auxiliar?

Casimiro Noteví 03-07-2010 22:34:46

Disculpa, pero no entiendo bien qué quieres hacer exactamente.

adeszeus 03-07-2010 22:37:17

Tomar la Impresion
 
lo que deseo es tomar la impresion de pantalla de mi cliente... y pueda visualizar lo que el cliente esta visualizando desde mi servidor. es decir lo que el cliente visualize lo pueda monitorear yo ya sea atravez de imagenes al menos, si fuera posible, algo similar al teamviewer o algo de ese tipo

Casimiro Noteví 03-07-2010 22:39:49

¿Pero quieres hacerlo tú mismo o quieres algún programa que lo haga?, si lo estás haciendo tú mismo... qué problema tienes y en qué podemos ayudarte?

AzidRain 03-07-2010 22:43:47

Puedes usar UltraVNC que es gratuito (no se si también libre), solo tienes que instalarlo en las pcs clientes, asignarle un puerto a cada una y hacer que se active al arranque de windows, inclusive puedes hacer que el usuario no pueda cerrarlo y que además sea invisible. La ventaja es que además de ver la pantalla del usuario, puedes controlar la pc, enviar mensajes de texto tipo chat y acceder a su disco duro (aunque no esté compartido). Lo puedes descargar aquí

Si como dice casimiro lo quieres hacer por tu cuenta, entonces es otro cantar.

Casimiro Noteví 03-07-2010 22:45:43

Cita:

Empezado por AzidRain (Mensaje 369103)
Puedes usar UltraVNC que es gratuito (no se si también libre), [..]

Es totalmente libre y gratis. Es el que uso todo los días para atender a mis clientes.

adeszeus 03-07-2010 23:50:09

no es por aplicaciones, si no realizarlo yo
 
el problema es que lo quiero hacer con componentes indy desde el mismo delphi... digo para chekar de manera remota esta el teamviewer, el ultravnc... pero mi problema es que yo mismo lo quiero resolver...espero tengan una ayuda... digo ya se como crear la impresion de pantalla y almacenarla en el cliente, ahora mi problema es enviar el archivo mendiante la red.. estaba checando con el TfileStream... pero no me llega el archivo...

este codigo es el k usaba
Código Delphi [-]
 
  FStream := TFileStream.Create('1.jpg', fmCreate);
  try
    AContext.connection.IOHandler.ReadStream(fStream, fmCreate);
    AContext.Connection.IOHandler.Free;
  finally
    AContext.connection.Disconnect;
  end;
  FreeAndNil(FStream);

pero no me almacena, me crea el archivo pero jamas lo puedo abrir...
ahora si en Acontext.connection.IOHandler.ReadStream( << esta seccion la cambio por TFileStream.create(extractfilepath(application.exename)+'1.jpg', fmcreate) si me lo crea pero tengo en ocasiones k cerrar la aplicacion y se mira la imagen... pero en otros ni eso hace... me pueden auxiliar?

adeszeus 04-07-2010 04:08:10

Aun Sigo sin poder Almacenar el Archivo
 
Sigo con el Problema... llega la información pero jamas puedo visualizar la imagen

adeszeus 04-07-2010 08:23:25

en donde esta el error
 
este es el codigo de el servidor
Código Delphi [-]
 
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
    sMensaje: String;
    fStream : TFileStream;
begin
 
  sMensaje := AContext.Connection.Socket.ReadLn;
  Mensaje.Lines.Add( 'De: ' + AContext.Binding.PeerIP );
  Mensaje.Lines.Add( 'Mensaje: ' + sMensaje );
   FStream := TFileStream.Create(
   ExtractFilePath(Application.ExeName) + 'servidor.jpg'
   , fmCreate);
  try
    AContext.connection.IOHandler.ReadStream(fstream);
  finally
    AContext.connection.Disconnect;
  end;
  FreeAndNil(FStream);
end;

y este es el codigo de mi cliente
Código Delphi [-]
var
  SrcWindow: THandle;
  SrcDC: HDC;
  Bitmap: TBitmap;
  Jpg: TJPEGImage;
  Stream: TMemoryStream;
  Width, Height: Integer;
begin
  contador:=contador+1;
  SrcWindow:= GetDesktopWindow;
  if SrcWindow <> 0 then
  begin
    SrcDC:= GetDC(SrcWindow);
    if SrcDC <> 0 then
    begin
      Bitmap:= TBitmap.Create;
      Jpg:= TJPEGImage.Create;
      try
        Width:= GetSystemMetrics(SM_CXSCREEN);
        Height:= GetSystemMetrics(SM_CYSCREEN);
          Bitmap.Width:= Width;
          Bitmap.Height:= Height;
        StretchBlt(Bitmap.Canvas.Handle,0,0,Bitmap.Width,Bitmap.Height,
          SrcDC,0,0,Width,Height,SRCCOPY);
        Jpg.CompressionQuality:= 40;
        Jpg.Assign(Bitmap);
        Jpg.Compress;
        Image1.Picture.Assign(Jpg);
        Stream:= TMemoryStream.Create;
        try
          Jpg.SaveToStream(Stream);
          IdTCPClient1.Host:='127.0.0.1'; //Prueba local
          IdTCPClient1.Port:=8080;
          IdTCPClient1.Connect;
          IdTCPClient1.Socket.WriteLn(mensaje.text);
          IdTCPClient1.IOHandler.Write(Stream, 0,true);
        finally
          Stream.Free;
        end;
      finally
        Bitmap.Free;
        Jpg.Free;
        ReleaseDC(SrcWindow,SrcDC);
      end;
    end;
  end;
IdTCPClient1.Disconnect;

Como se daran cuenta en este codigo, tomo la impresion de pantalla... y la deposito en un image para visualizar lo que envio... todo esta bien y aparentemente si recibe el stream mi IDTCPServer... pero jamas la puedo visualizar... hubo un momento en que si cerraba o liberaba el stream... pero segui trabajando y moviendo codigo y resulta que al final ya no funciona =( ... y hasta donde recuerdo esa era la base

Faust 05-07-2010 17:12:15

He aquí un ejemplo si lo quieres hacer tu mismo: http://delphi.about.com/od/interneti.../aa012004a.htm

adeszeus 05-07-2010 18:46:23

ya lo conocia
 
Ese ejemplo ya lo conocia.... y esta hecho con indy 9 y es totalmente inutil para el delphi 2010... asi que no me sirvio para nada, o al menos jamas pude interpretar los eventos que tiene, poco a poco va mejorando el proyecto y encontre dos maneras de hacerlo, enviar solamente la impresion de pantalla desde stream.... o archivo, especifico que esta hecho para imagenes, el codigo es es siguiente

Enviar archivo:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  FileStream : TFileStream;
  filename:string;
begin
if (opendialog1.Execute) then
filename:=opendialog1.FileName;
  if FileName = '' then Exit;
  FileStream := TFileStream.Create(FileName, fmOpenRead);
  IdTCPClient1.Host:='127.0.0.1';
  IdTCPClient1.Port:=8080;
  IdTCPClient1.Connect;
  IdTCPClient1.IOHandler.Write(FileStream,0,true);
  IdTCPClient1.Disconnect;
end;

Enviar impresion de pantalla y convertirla a jpg

Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
var
  SrcWindow: THandle;
  SrcDC: HDC;
  Bitmap: TBitmap;
  Jpg: TJPEGImage;
  Stream: TMemoryStream;
  Width, Height: Integer;
begin
  SrcWindow:= GetDesktopWindow;
  if SrcWindow <> 0 then
  begin
    SrcDC:= GetDC(SrcWindow);
    if SrcDC <> 0 then
    begin
      Bitmap:= TBitmap.Create;
      Jpg:= TJPEGImage.Create;
      try
        Width:= GetSystemMetrics(SM_CXSCREEN);
        Height:= GetSystemMetrics(SM_CYSCREEN);
          Bitmap.Width:= Width;
          Bitmap.Height:= Height;
        StretchBlt(Bitmap.Canvas.Handle,0,0,Bitmap.Width,Bitmap.Height,
          SrcDC,0,0,Width,Height,SRCCOPY);
        Jpg.CompressionQuality:= 60;
        Jpg.Assign(Bitmap);
        Jpg.Compress;
        Image1.Picture.Assign(Jpg);
        Stream:= TMemoryStream.Create;
        try
          Jpg.SaveToStream(Stream);
            IdTCPClient1.Host:='127.0.0.1'; //Prueba local
            IdTCPClient1.Port:=8080;
            IdTCPClient1.Connect;
            IdTCPClient1.IOHandler.Write(Stream, 0,true);
        finally
          Stream.Free;
        end;
      finally
        Bitmap.Free;
        Jpg.Free;
        ReleaseDC(SrcWindow,SrcDC);
      end;
    end;
  end;
IdTCPClient1.Disconnect;
end;

---------Lado Servidor--------

Aceptar Archivo

Código Delphi [-]
var
fStream : TFileStream;
begin
  //Traigo y  muestro mensaje
  Mensaje.Lines.Add( 'De: ' + AContext.Binding.PeerIP );
  //Guardo archivo enviado
  fStream := TFileStream.Create(
  ExtractFilePath(Application.ExeName) +'prueba.jpg'
  , fmCreate);
  try
    AContext.connection.IOHandler.ReadStream(fstream,0, True);
  finally
    AContext.connection.Disconnect;
  end;
  FreeAndNil(fStream);
fStream.Free;
end;

Visualizar el stream

Código Delphi [-]
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
stream:TmemoryStream;
jpg:Tjpegimage;
begin
  //Traigo y  muestro mensaje
  Mensaje.Lines.Add( 'De: ' + AContext.Binding.PeerIP );
  //Guardo archivo enviado
  stream:=tmemorystream.Create;
  AContext.Connection.IOHandler.ReadStream(stream,0,true);
  stream.Seek(0, soFromBeginning);
  jpg:=tjpegimage.create;
  jpg.LoadFromStream(stream);
Image1.Picture.Assign(jpg);
FreeAndNil(stream);
jpg.Free;
end;

Espero les sirva a los demas, y pues poco a poco se va complementando el ejercicio :)


La franja horaria es GMT +2. Ahora son las 16:46:17.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi