PDA

Ver la Versión Completa : Tomar pantalla de clientes


adeszeus
03-07-2010, 22:03:11
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 Notevi
03-07-2010, 22:34:46
Disculpa, pero no entiendo bien qué quieres hacer exactamente.

adeszeus
03-07-2010, 22:37:17
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 Notevi
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í (http://www.uvnc.com/)

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

Casimiro Notevi
03-07-2010, 22:45:43
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
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

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
Sigo con el Problema... llega la información pero jamas puedo visualizar la imagen

adeszeus
04-07-2010, 08:23:25
este es el codigo de el servidor

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
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/internetintranet/l/aa012004a.htm

adeszeus
05-07-2010, 18:46:23
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:

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

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

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


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 :)