Hola amigos delphinos me encuentro entre la espada y la pared, les comento para entrar en tema.Estoy continuamente trabajando remotamente instalando y configurando maquinas de clientes pero me suele pasar que mis clientes o le parece muy dificil decime su IP o Passord (VNC) para ingresar remotamente o peor no saben como abrir algun puerto TCP para realizar la conexion, gracias a este dolor de cabeza estoy diseñando algo parecido a un VNC con algunas mejoras administativa, la idea que tengo es que el cliente se conecte a la mesa de ayuda por medio de un ejecutable para chatear y si fuese necesario poder ingresar a la pc para realizar la reparcion o configuracion.
Para evitar el Firewall se me ocurrio que la aplicacion funcione inversamente que el VNC o sea el cliente tiene un socket cliente y yo un server (emularia un browser o saldria por el port 21)hasta ahi cerramaba pero ahora necesitaba enviar una imagen de la pc y actualizar solo los pixeles que cambiaban utilizando el siguiente codigo:
para tomar una imagen:
Código Delphi
[-]
procedure TFServer.GetDesktop(Imagen:integer);
var
imag: TImage;
jpg: TJpegImage;
desktop: TCanvas;
begin
imag:=TImage.Create(FServer);
imag.Width:=screen.Width;
imag.Height:=screen.Height;
desktop:=TCanvas.Create;
with DeskTop do
Handle := GetWindowDC (GetDesktopWindow) ;
with Imag.Canvas do
CopyRect (Rect (0, 0, screen.Width, screen.Height),DeskTop,Rect (0, 0, screen.Width, screen.Height));
jpg:=TJPegImage.Create;
jpg.Assign(imag.Picture.Bitmap);
imag.Free;
jpg.CompressionQuality:=80; jpg.Compress; jpg.SaveToFile(IntToStr(Imagen)+'.jpg');
jpg.Free;
desktop.Free;
end;
Y para tomar las diferencias:
Código Delphi
[-]
procedure comparar();
var
jpg: TJpegImage;
bmp1,bmp2: TImage;
int1,int2,int3:integer;
FInteger: file of integer;
begin
if (not fileexists('1.jpg'))or(not fileexists('2.jpg')) then exit;
bmp1:=TImage.Create(FServer);
jpg := TJpegImage.Create;
try
jpg.LoadFromFile('1.jpg');
bmp1.Picture.Bitmap.Assign(jpg); finally
jpg.Free;
end;
bmp2:=TImage.Create(FServer);
jpg := TJpegImage.Create;
try
jpg.LoadFromFile('2.jpg');
bmp2.Picture.Bitmap.Assign(jpg); finally
jpg.Free;
end;
AssignFile(FInteger,'3.int');
Rewrite(FInteger);
for int1 := 0 to (bmp1.Picture.Bitmap.Height - 1) do
begin
for int2 := 0 to (bmp1.Picture.Bitmap.Width - 1) do
begin
if (bmp1.Picture.Bitmap.Canvas.Pixels[int2,int1] <>
bmp2.Picture.Bitmap.Canvas.Pixels[int2,int1]) then
begin
int3:=bmp2.Picture.Bitmap.Canvas.Pixels[int2,int1];
Write(FInteger,int3); Write(FInteger,int2); Write(FInteger,int1); end;
end;
end;
CloseFile(FInteger);
bmp1.Free;
bmp2.Free;
end;
pero noto que las imagenes generadas pesan 112Kb y el archivo de diferencias pesan mas que la imagen y que el recorrido de pixel a pixel es muy lento.
A Alguien se le ocurre como optimizar el codigo o como puedo interactuar con las DLL del VNC
Desde ya muchas gracias