Implementación de captura de pantalla remota usando Delphi
Centro CAD de Shandong Juli Co., Ltd.
Tan Geqin
---- En la gestión de redes, a veces es necesario comprender el uso de las computadoras en línea monitoreando la pantalla de la computadora remota. Aunque hay muchos programas en el mercado que pueden lograr esta función, y algunos incluso pueden realizar el control remoto, carecen de flexibilidad de uso. Por ejemplo, no pueden especificar el tamaño y la posición del área de la pantalla de la computadora remota y, por lo tanto, no pueden monitorear múltiples. pantallas en una pantalla al mismo tiempo. De hecho, puede utilizar Delphi para compilar una herramienta flexible de captura de pantalla remota, que se describe brevemente a continuación.
---- 1. Requisitos de software y hardware.
---- Red peer-to-peer Windows95/98, la computadora utilizada para el monitoreo (en adelante, la computadora maestra) y la computadora que se está monitoreando (en lo sucesivo, la computadora controlada) deben estar equipadas con TCP/ip. protocolo y configurado correctamente. Si no hay red, también puede depurar en una computadora.
---- 2. Método de implementación.
---- Prepare dos aplicaciones, una es VClient.exe, instalada en la máquina controlada, y la otra es VServer.exe, instalada en la máquina de control principal. VServer.exe especifica la dirección IP de la máquina controlada que se monitoreará y el tamaño y la posición del área que se capturará en la pantalla de la máquina controlada, y envía una instrucción de captura de pantalla a VClient.exe. Después de recibir la instrucción, VClient. .exe Seleccione un área designada en la pantalla de la computadora, genere un flujo de datos, envíelo de regreso a la computadora host y muestre la imagen BMP del área capturada en la computadora host. Del proceso anterior se puede ver que hay dos claves para este método: una es cómo capturar la pantalla en la máquina controlada y la otra es cómo transmitir datos entre las dos computadoras a través del protocolo TCP/IP.
---- UDP (User Datagram PROtocol, que significa Protocolo de mensajes de usuario) es uno de los protocolos de comunicación más utilizados en Internet. A diferencia del protocolo TCP, es un protocolo de transmisión sin conexión, sin mecanismo de confirmación y no es tan confiable como TCP, pero es más eficiente que TCP y más adecuado para el monitoreo remoto de pantalla. Al mismo tiempo, el control UDP no distingue entre servidor y cliente, solo el extremo emisor y el extremo receptor. La programación es relativamente simple, por lo que se selecciona el protocolo UDP y se utiliza el control TNMUDP proporcionado por Delphi 4.0.
---- 3. Cree un programa de demostración.
----El primer paso es compilar el archivo VClient.exe. Cree un nuevo proyecto Delphi y establezca la propiedad Nombre del formulario predeterminado en "Cliente". Agregue el control TNMUDP, establezca el atributo Nombre en "CUDP" y establezca el atributo LocalPort en "1111", deje que el control CUDP monitoree el puerto 1111 de la máquina controlada y, cuando se envíen datos al puerto, active el evento OnDataReceived de el CUDP de control establece que el atributo RemotePort es "2222". Cuando el CUDP de control envía datos, los datos se envían al puerto 2222 de la computadora host.
---- Agregar definición de variable después de la implementación
const BufSize=2048;{Tamaño del búfer para enviar cada dato}
var
BmpStream:TMemoryStream;
LeftSize:Longint;{El número de bytes restantes después de enviar cada dato}
Agregue código para el evento OnCreate del Cliente:
procedimiento TClient.FormCreate(Remitente: TObject);
comenzar
BmpStream:=TMemoryStream.Create;
fin;
Agregue código para el evento OnDestroy del Cliente:
procedimiento TClient.FormDestroy(Remitente: TObject);
comenzar
BmpStream.Gratis;
fin;
Agregue código para el evento OnDataReceived del control CUDP:
procedimiento TClient.CUDPDataReceived(Remitente: TComponent;
NúmeroBytes: Entero; DesdeIP: Cadena);
var
CtrlCode:matriz[0..29] de carácter;
Buf:matriz[0..BufSize-1] de char;
TmpStr: cadena;
EnviarTamaño,PosIzquierda,PosSuperior,PosDerecha,PosInferior:entero;
comenzar
CUDP.ReadBuffer(CtrlCode,NumberBytes);{Leer código de control}
si CtrlCode[0]+CtrlCode[1]+CtrlCode[2]+CtrlCode[3]='mostrar' entonces
comenzar {Los primeros 4 dígitos del código de control son "mostrar", lo que indica que la computadora host ha emitido un comando de captura de pantalla}
si BmpStream.Size=0 entonces {No se pueden enviar datos, se deben tomar capturas de pantalla para generar datos}
comenzar
TmpStr:=StrPas(CtrlCode);
TmpStr:=Copiar(TmpStr,5,Longitud(TmpStr)-4);
LeftPos:=StrToInt(Copy(TmpStr,1,Pos(':',TmpStr)-1));
TmpStr:=Copiar(TmpStr,Pos(':',TmpStr)+1,Longitud(TmpStr)
-Pos(':',TmpStr));
TopPos:=StrToInt(Copy(TmpStr,1,Pos(':',TmpStr)-1));
TmpStr:=Copiar(TmpStr,Pos(':',TmpStr)+1,Longitud(TmpStr)-
Pos(':',TmpStr));
RightPos:=StrToInt(Copy(TmpStr,1,Pos(':',TmpStr)-1));
BottomPos:=StrToInt(Copiar(TmpStr,Pos(':',TmpStr
)+1,Longitud(TmpStr)-Pos(':',TmpStr)));
ScreenCap(PosIzquierda,PosSuperior,PosDerecha,PosInferior);
Tomar una captura de pantalla}
fin;
si LeftSize>BufSize entonces SendSize:=BufSize
else EnviarTamaño:=TamañoIzquierdo;
BmpStream.ReadBuffer(Buf,SendSize);
TamañoIzquierdo:=TamañoIzquierdo-TamañoEnviar;
si LeftSize=0 entonces BmpStream.Clear;{borrar flujo}
CUDP.RemoteHost:=FromIP; {FromIP es la dirección IP del host}
CUDP.SendBuffer(Buf,SendSize); {Enviar datos al puerto 2222 de la computadora host}
fin;
fin;
ScreenCap es una función personalizada que captura el área especificada de la pantalla.
El código es el siguiente:
procedimiento TClient.ScreenCap(LeftPos,TopPos,
PosDerecha,PosInferior:entero);
var
Ancho Rect, Altura Rect: entero;
FuenteDC,DestDC,Bhandle:entero;
Mapa de bits:TBitmap;
comenzar
RectWidth:=PosDerecha-PosIzquierda;
AlturaRect:=PosInferior-PosSuperior;
FuenteDC:=CreateDC('DISPLAY',',',nil);
DestinoDC:=CreateCompatibleDC(FuenteDC);
Bhandle:=Crear mapa de bits compatible(FuenteDC,
Ancho Rect, Altura Rect);
SeleccionarObjeto(DestDC,Bhandle);
BitBlt(DestDC,0,0,RectWidth,RectHeight,SourceDC,
PosIzquierda,PosArriba,SRCCOPY);
Mapa de bits:=TBitmap.Create;
Mapa de bits.Handle:=BHandle;
BitMap.SaveToStream(BmpStream);
BmpStream.Posición:=0;
TamañoIzquierdo:=BmpStream.Size;
Mapa de bits.Gratis;
EliminarDC(DestDC);
ReleaseDC(Bhandle,FuenteDC);
fin;
Guardar como "C:VClientClnUnit.pas" y "C:VClientVClient.dpr",
y compilar.
----El segundo paso es compilar el archivo VServer.exe. Cree un nuevo proyecto Delphi y establezca la propiedad Nombre del formulario en "Servidor". Agregue el control TNMUDP, establezca el atributo Nombre en "SUDP" y establezca el atributo LocalPort en "2222", deje que el control SUDP supervise el puerto 2222 de la computadora host y, cuando se envíen datos al puerto, active el evento OnDataReceived de el SUDP de control; establezca el atributo RemotePort en "1111", cuando el SUDP de control envía datos, los datos se envían al puerto 1111 de la máquina controlada. Agregue el control Imagen1, establezca la propiedad Alinear en "alClient"; agregue el control Botón1, establezca la propiedad Título en "Captura de pantalla"; agregue el control Etiqueta1, establezca la propiedad Título en "Izquierda: Arriba: Derecha: Abajo"; Ingrese el control Edit1 y establezca la propiedad Texto en "0:0:100:100"; agregue el control Label2 y establezca la propiedad Título en "dirección IP de la máquina controlada"; agregue el control Edit2 y establezca la propiedad Texto en "127.0.0.1";
Agregar definición de variable después de la implementación
const TamañoBuf=2048;
var
RsltStream,TmpStream:TMemoryStream;
Agregue código para el evento OnCreate del servidor:
procedimiento TServer.FormCreate(Remitente: TObject);
comenzar
RsltStream:=TMemoryStream.Create;
TmpStream:=TMemoryStream.Create;
fin;
Agregue código para el evento OnDestroy del Cliente:
procedimiento TServer.FormDestroy(Remitente: TObject);
comenzar
RsltStream.Gratis;
TmpStream.Gratis;
fin;
Agregue código para el evento OnClick del control Button1:
procedimiento TServer.Button1Click (Remitente: TObject);
var ReqCode:matriz[0..29] de char;ReqCodeStr:cadena;
comenzar
ReqCodeStr:='mostrar'+Edit1.Text;
StrpCopy(ReqCode,ReqCodeStr);
TmpStream.Claro;
RsltStream.Claro;
SUDP.RemoteHost:=Edit2.Text;
SUDP.SendBuffer(ReqCode,30);
fin;
Agregue código para el evento OnDataReceived del control SUDP:
procedimiento TServer.SUDPDataReceived(Remitente: TComponent;
NúmeroBytes: Entero; DesdeIP: Cadena);
var ReqCode:matriz[0..29] de char;ReqCodeStr:cadena;
comenzar
ReqCodeStr:='mostrar'+Edit1.text;
StrpCopy(ReqCode,ReqCodeStr);
SUDP.ReadStream(TmpStream);
RsltStream.CopyFrom(TmpStream,NumberBytes);
si NumberBytes< BufSize entonces {se han leído los datos}
comenzar
RsltStream.Posición:=0;
Imagen1.Imagen.Mapa de bits.LoadFromStream(RsltStream);
TmpStream.Claro;
RsltStream.Claro;
fin
demás
comenzar
TmpStream.Claro;
CódigoReq:='mostrar';
SUDP.RemoteHost:=Edit2.Text;
SUDP.SendBuffer(ReqCode,30);
fin;
fin;
Guárdelo como "C:VServerSvrUnit.pas" y
"C:VServerVServer.dpr" y compilar.
---- 4. Prueba.
---- 1. Prueba de máquina local: ejecute Vserver.exe y VClient.exe al mismo tiempo en la máquina local y use la configuración predeterminada del programa para tomar capturas de pantalla. Marque "Panel de control" - "Red" - "TCP/IP" - "Dirección IP", configure la "Dirección IP del cliente" del programa en esta dirección y se ejecutará normalmente.
---- 2. Prueba remota: seleccione una máquina controlada, ejecute VClient.exe; seleccione otra máquina maestra, ejecute VServer.exe y configure la "dirección IP de la máquina controlada", es decir, el contenido de Edit2, como controlado. Dirección IP de la máquina y "tomar una captura de pantalla". Lo anterior presenta brevemente el método de implementación de la captura de pantalla remota. En cuanto a monitorear múltiples máquinas controladas al mismo tiempo en una pantalla en la máquina de control principal, los lectores pueden mejorarlo por sí mismos. El programa anterior fue depurado y aprobado bajo la red peer-to-peer de Windows98 y Delphi 4.0.