Red de conocimiento informático - Conocimiento del nombre de dominio - Llame para conocer la forma más rápida de transferir la pantalla. Preferiblemente código fuente Delphi o C++. Más rápido que Black Hole 2007 (v1.x) o Radmin.

Llame para conocer la forma más rápida de transferir la pantalla. Preferiblemente código fuente Delphi o C++. Más rápido que Black Hole 2007 (v1.x) o Radmin.

Utilice transmisiones en Delphi para implementar la transmisión en red de imágenes de pantalla. El programa se divide en dos partes: servidor y cliente. El programa compilado se puede utilizar directamente en una computadora independiente, una red local o Internet.

Principio del programa: ejecute el servidor para comenzar a monitorear, luego ejecute el cliente, ingrese la dirección IP del servidor para establecer una conexión y luego envíe caracteres para notificar al servidor que capture la pantalla. El servidor llama a la función personalizada Cjt_GetScreen, guarda la pantalla capturada en BMP, convierte el BMP a JPG, escribe el JPG en una secuencia de memoria y luego envía la secuencia al cliente. Después de recibir la transmisión, el cliente realiza la operación opuesta, convierte la transmisión a JPG, luego la convierte a BMP y luego la muestra

Cree un nuevo proyecto y arrastre el control ServerSocket en el panel de Internet al ventana.El control se utiliza principalmente para monitorear el cliente y establecer una conexión y comunicarse con el cliente. Después de configurar el puerto de escucha, llame al método Open o Active:=True para comenzar. Cuando se pasan datos desde el cliente, se activará el evento ServerSocket1ClientRead y podremos procesar los datos recibidos en este evento. En este programa, el objetivo principal es recibir la información de los personajes enviada por el cliente y realizar las operaciones correspondientes según el acuerdo previo.

El código de todo el programa es el siguiente:

Unidad Unidad1;{programa del lado del servidor}

Interfaz

Propósito

Windows, Mensajes, SysUtils, Clases, Gráficos, Controles.

Formulario, diálogo, JPEG, ExtCtrls, ScktComp;

Tipo

TForm1 = clase(TForm)

ServerSocket1:

procedimiento ServerSocket1ClientRead( Remitente: TObject;Socket: TCustomWinSocket);

procedimiento FormCreate(Remitente: TObject);

procedimiento FormClose(Remitente: TObject; var Acción: TCloseAction);

privado

procedimiento Cjt_GetScreen(var Mybmp:Cjt_GetScreen(var Mybmp: TBitmap; DrawCur: Boolean);

{Personaliza la función de captura de pantalla, DrawCur significa capturar la imagen del mouse o no }

{ Declaraciones privadas }

públicas

{ Declaraciones públicas }

end;

var

Form1: TForm1;

MyStream: TMemorystream;{ Objeto de flujo de memoria }

MyStream: TMemorystream;{ Objeto de flujo de memoria

implementación

{$R *.DFM }

procedimiento TForm1.Cjt_GetScreen(var Mybmp: TBitmap; DrawCur: Boolean);

var

Cursorx , Cursorio: entero;

dc: hdc;

Mycan: Tcanvas

R: TRect

DrawPos: TPoint;

MiCursor: TIcon;

hld: hwnd;

Threadld: dword;

mp: tpoint;

pIconInfo:Handle := dc;

R := Rect(0, 0, screen.Width, screen.Height);

Mybmp.Width := R.Right

Mybmp.Height := R.Bottom;

Mybmp.Canvas.CopyRect(R);

Mybmp.Canvas.CopyRect(R);

p>

Mybmp.Canvas.CopyRect(R)DrawCur y luego {dibuja la imagen del mouse}

comienza

GetCursorPos(DrawPos);

MiCursor: = TIcon.Create;

getcursorpos(mp);

hld := WindowFromPoint(mp);

Threadld := GetWindowThreadProcessId(hld, nil); );

Adjuntar

readInput(GetCurrentThreadId, Threadld, True);

MyCursor.Handle := Getcursor();

AttachThreadInput(GetCurrentThreadId, threadld, False); Mycursor.Canvas.Draw(cursorx,cursory,MyCursor);{Dibuja el mouse}

DeleteObject(pIconInfo.hbmColor);{Cuando se usa GetIconInfo, se crearán dos objetos de mapa de bits y deberás liberarlos manualmente}<. /p>

DeleteObject(pIconInfo.hbmMask);{De lo contrario, después de llamarlo, creará un mapa de bits y varias llamadas generarán múltiples mapas de bits hasta que se agoten los recursos}

Mycursor.ReleaseHandle;{Liberar el objeto de mapa de bits}

Mycursor.ReleaseHandle;{Liberar el objeto de mapa de bitsReleaseHandle; {Liberar la memoria en la matriz}

MyCursor;

Myjpg: TJpegimage;

begin

S := Socket.ReceiveText;

si S = 'cap' entonces {El cliente envía el comando de captura de pantalla}

comenzar

probar

MyStream := TMemorystream.Create;{crear flujo de memoria}

MyBmp := TBitmap.Create ;

Myjpg := TJpegimage.Create;

Cjt_GetScreen(MyBmp, True); {True significa tomar MouseImage}

Myjpg.Assign(MyBmp); Formato JPG para una fácil transmisión en Internet}

Myjpg.CompressionQuality:= 10; {configuración del porcentaje de compresión de archivos JPG, cuanto mayor sea el número de imágenes, más clara será la imagen, pero mayor será la cantidad de datos}

Myjpg.CompressionQuality := 10; {Configuración del porcentaje de compresión del archivo JPG, cuanto mayor sea el número de imágenes, más clara será la imagen, pero mayor será la cantidad de datos SaveTime(TJpegImage.Create); tomando la imagen del mouse }

Cjt_GetScreen(MyBmp, True); {True significa tomando la imagen del mouse}

Myjpg.

>Myjpg.SaveToStream(MyStream); {Escribir imagen JPG en flujo de datos}

Myjpg.free;

MyStream.SaveToStream(MyStream); {Escribir imagen JPG en flujo de datos Posición: = 0;{Nota: Esto debe agregarse}

s1 := inttostr(MyStream. Size);{Tamaño de transmisión}

Socket.sendtext(s1); }

Último

MyBmp.free;

Myjpg.free;

MyStream.Position := 0;{Nota: Esto debe ser agregado}

s1 := inttostr(MyStream.free;

end;

end;

end;

p>

end;

si s = 'listo' entonces {El cliente está listo para recibir la imagen}

comenzar

MyStream.Position := 0 ;

Socket.SendStream(MyStream)SendStream(MyStream); {Enviar la transmisión}

end;

end;

end; .

fin.

Lo anterior es el lado del servidor. Escribiremos el programa cliente. Crearemos un nuevo proyecto y agregaremos el control de socket ClientSocket, el control de visualización de imágenes Image y un. Un panel de edición, dos botones y una barra de estado controlan StatusBar1. Nota: Coloque Edit1 y dos botones en la parte superior de Panel1. Las propiedades de ClientSocket son similares a ServerSocket, pero hay una propiedad de dirección adicional, que representa la IP del. Dirección del servidor que se va a conectar Después de completar la dirección IP, haga clic en "Conectar" para establecer una conexión con el programa del servidor. Después de que la conexión sea exitosa, haga clic en "Capturar pantalla" para enviar caracteres al servidor. en Usos.

Todos los códigos son los siguientes:

unidad Unidad2{cliente};

interfaz

usa

Windows , Mensajes,SysUtils.Classes,Gráficos,Controles,Formularios,Diálogos,StdCtrls,ScktComp,ExtCtrls,Jpeg,ComCtrls;

tipo

TForm1 = clase(TForm)

ClientSocket1: TClientSocket;

Imagen1: TImage;

StatusBar1: TStatusBar;

Panel1: TPanel;

Editar1: TEdit ;

Botón1: TButton;

Botón2: TButton;

procedimiento Button1Click(Remitente: TObject);

procedimiento ClientSocket1Connect(Sender. TObject;

Socket: TCustomWinSocket);

procedimiento Button2Click(Remitente: TObject);

procedimiento ClientSocket1Error(Sender. TObject;

Socket: TCustomWinSocket);

procedimiento Button2Click(Sender: TObject);

procedimiento ClientSocket1Error(Sender. TObject;

Socket: TCustomWinSocket)

Procedimiento ClientSocket1Error(Remitente: TCustomWinSocket;

ErrorEvent: TErrorEvent; var ErrorCode:

procedimiento ClientSocket1Read(Sender. TObject; Socket: TCustomWinSocket);

procedimiento FormCreate( Remitente: TObject);

procedimiento FormClose(Remitente: TObject; var Action.TCloseAction);

procedimiento ClientSocket1Disconnect(Remitente: TObject;

Socket: TCustomWinSocket) ;

privado

{ Declaraciones privadas }

públicas

{ Declaraciones públicas }

end;

p>

var

Form1: TForm1;

MySize: Entero largo;

MyStream: TMemorystream;{Objeto de flujo de memoria }

implementación

{$R *.DFM}

procedimiento TForm1.FormCreate(Sender: TObject);

comenzar

{--

------ A continuación, necesitamos configurar las propiedades de apariencia del control de ventana------------ }

{Nota: Coloque el Botón1, el Botón2 y Editar1 en parte superior del Panel1}

Edit1.Text := '127.0.0.1';

Button1.Caption := 'Conectar al host';

Button2.Caption := 'Agarrar pantalla ';

Button2.Enabled := false;

Panel1.Align := alTop

Alineación Image1.Align:= alClient;

Imagen1.Stretch := Verdadero

StatusBar1.Align := alBottom

StatusBar1.SimplePanel := Verdadero

{ ----- -------- ---------------------------------- }

MyStream := TMemorystream.Create; {Crear un objeto de flujo de memoria.

Dirección := Edit1.Text; {dirección IP remota}

ClientSocket1.Port := 3000; {puerto de socket}

ClientSocket1.Open {establecer conexión}

Fin;

Fin;

procedimiento TForm1.Button2Click(Sender.Button2Click)(Sender.Button2Click)(Sender.Button2Click)(Sender.Button2Click)(Button2Click(Sender: TObject );

begin

Clientsocket1.Socket.SendText('cap'); {Enviar un comando para notificar al servidor que capture la imagen de la pantalla}

Botón2 .Enabled := False;

Clientsocket1.Socket.SendText('cap'); {Enviar un comando para notificar al servidor que capture imágenes de pantallaEnabled := False;

end;

procedimiento TForm1.ClientSocket1Connect(Remitente: TObject;

Socket: TCustomWinSocket);

Clientsocket1.SimpleText := 'Conexión con el host ' + ClientSocket1.Address + ' ¡Conexión establecida exitosamente! ' ;

Button2.Enabled := True;

end;

procedimiento TForm1.ClientSocket1Error(Remitente: TForm1.ClientSocket1Error(Remitente: TObject ;

Socket:

Socket: TCustomWinSocket.Sender: TObject;

Socket: TCustomWinSocket: TErrorEvent;

var ErrorCode: Entero) ;

comenzar

Código de error := 0; {No hay ventana emergente de error}

StatusBar1.SimpleText := 'No se puede comunicar con el host' + ClientSocket1 .SimpleText := 'Desconectado del host ' + ClientSocket1.Address + '¡Desconectado! ;

Botón2.Enabled := Falso;

fin;

procedimiento TForm1.ClientSocket1Read(Remitente: TObject;

Socket: TCustomWinSocket);

var

MyBuffer: matriz de bytes [0...10000]; recibir buffer}

MyReceviceLength: entero

S: cadena

MyBmp: TBitmap

MyJpg: TJpegimage;

comenzar

StatusBar1.SimpleText := 'Recibiendo datos

...' ;

si MySize = 0 entonces {MySize es el número de bytes enviados por el servidor, si es 0, significa que la imagen aún no se ha recibido}

begin

S := Socket.ReceiveText;

MySize := Strtoint(S); {Establece el número de bytes que se recibirán}

StatusBar1 .SimpleText := 'Recibiendo datos ';

si MySize = 0 entonces {MySize es el número de bytes enviados por el servidor. Si es 0, significa que la imagen aún no se ha recibido. := Socket.ReceiveText;

S : = Socket.ReceiveText;

MySize := Strtoint(S); {Establece el número de bytes a recibir}

Clientsocket1.Socket.ReceviceLength := Socket.ReceiveText;

S := Socket.ReceiveText;

MySize := Strtoint(S); recibido SendText('ready'); {Enviar un comando para notificar al servidor que comience a enviar imágenes}

End

else

begin {Aquí está la imagen parte de datos a recibir}

MyReceviceLength := socket.ReceiveLength; {leer Obtener el número de bytes en el paquete de datos}

Clientsocket1.Socket. RecibirBuf(MyBuffer, MyReceviceLength); {Recibir paquete de datos y leerlo en el búfer}

MyStream.Write(MyBuffer, MyReceviceLength); {Escribir datos en flujo de datos}

if MyStream. Tamaño >= MySize entonces {si la longitud del flujo es mayor que el número de bytes a recibir, la recepción se completa}

comenzar

MyStream.Position := 0;

MyBmp := tbitmap.Create;

MyJpg := tjpegimage.Create;

prueba

MyJpg.LoadFromStream(MyBuffer.LoadFromStream)MyStream .Free ; {Liberar el objeto de flujo de memoria}

si ClientSocket1.Active entonces ClientSocket1.Close; {Cerrar la conexión del socket}

end;

end.