Implémentation d'une capture d'écran à distance à l'aide de Delphi
Centre de CAO de Shandong Juli Co., Ltd.
Tan Geqin
---- Dans la gestion de réseau, il est parfois nécessaire de comprendre l'utilisation des ordinateurs en ligne en surveillant l'écran de l'ordinateur distant. Bien qu'il existe de nombreux logiciels sur le marché qui peuvent réaliser cette fonction, et certains peuvent même effectuer un contrôle à distance, ils manquent de flexibilité d'utilisation. Par exemple, ils ne peuvent pas spécifier la taille et la position de la zone de l'écran de l'ordinateur distant et ne peuvent donc pas en surveiller plusieurs. écrans sur un écran en même temps. En fait, vous pouvez utiliser Delphi pour compiler un outil flexible de capture d'écran à distance, brièvement décrit comme suit.
---- 1. Exigences logicielles et matérielles.
---- Réseau peer-to-peer Windows95/98, l'ordinateur utilisé pour la surveillance (ci-après dénommé l'ordinateur maître) et l'ordinateur surveillé (ci-après dénommé l'ordinateur contrôlé) doivent être équipés du protocole TCP/IP. protocole et configuré correctement. S'il n'y a pas de réseau, vous pouvez également déboguer sur un ordinateur.
---- 2. Méthode de mise en œuvre.
---- Préparez deux applications, l'une est VClient.exe, installée sur la machine contrôlée, et l'autre est VServer.exe, installée sur la machine de contrôle principale. VServer.exe spécifie l'adresse IP de la machine contrôlée à surveiller ainsi que la taille et la position de la zone à capturer sur l'écran de la machine contrôlée, et émet une instruction de capture d'écran à VClient.exe Après avoir reçu l'instruction, VClient. .exe Sélectionnez une zone désignée sur l'écran de l'ordinateur, générez un flux de données, renvoyez-le à l'ordinateur hôte et affichez l'image BMP de la zone capturée sur l'ordinateur hôte. Le processus ci-dessus montre qu'il y a deux clés dans cette méthode : l'une est de savoir comment capturer l'écran sur la machine contrôlée et l'autre est de savoir comment transmettre des données entre les deux ordinateurs via le protocole TCP/IP.
---- UDP (User Datagram PROtocol, signifiant User Message Protocol) est l'un des protocoles de communication les plus utilisés sur Internet. Différent du protocole TCP, il s'agit d'un protocole de transmission sans connexion, sans mécanisme de confirmation, et n'est pas aussi fiable que TCP, mais il est plus efficace que TCP et convient mieux à la surveillance d'écran à distance. Dans le même temps, le contrôle UDP ne fait pas de distinction entre le serveur et le client, seulement l'extrémité émettrice et l'extrémité réceptrice. La programmation est relativement simple, donc le protocole UDP est sélectionné et le contrôle TNMUDP fourni par Delphi 4.0 est utilisé.
---- 3. Créez un programme de démonstration.
----La première étape consiste à compiler le fichier VClient.exe. Créez un nouveau projet Delphi et définissez la propriété Name du formulaire par défaut sur "Client". Ajoutez le contrôle TNMUDP, définissez l'attribut Name sur "CUDP" ; définissez l'attribut LocalPort sur "1111", laissez le contrôle CUDP surveiller le port 1111 de la machine contrôlée et lorsque les données sont envoyées au port, déclenchez l'événement OnDataReceived de le contrôle CUDP ; définissez l'attribut RemotePort sur "2222", lorsque le contrôle CUDP envoie des données, les données sont envoyées au port 2222 de l'ordinateur hôte.
---- Ajouter une définition de variable après la mise en œuvre
const BufSize=2048;{Taille du tampon pour l'envoi de chaque donnée}
var
BmpStream:TMemoryStream;
LeftSize:Longint;{Le nombre d'octets restants après l'envoi de chaque élément de données}
Ajoutez du code pour l'événement OnCreate du client :
procédure TClient.FormCreate(Expéditeur : TObject);
commencer
BmpStream:=TMemoryStream.Create;
fin;
Ajoutez du code pour l'événement OnDestroy du client :
procédure TClient.FormDestroy(Expéditeur : TObject);
commencer
BmpStream.Free;
fin;
Ajoutez du code pour l'événement OnDataReceived du contrôle CUDP :
procédure TClient.CUDPDataReceived(Expéditeur : TComponent ;
NombreOctets : Entier ; FromIP : Chaîne );
var
CtrlCode:array[0..29] de caractères ;
Buf:array[0..BufSize-1] de caractère ;
TmpStr : chaîne ;
SendSize, LeftPos, TopPos, RightPos, BottomPos : entier ;
commencer
CUDP.ReadBuffer(CtrlCode,NumberBytes);{Lire le code de contrôle}
si CtrlCode[0]+CtrlCode[1]+CtrlCode[2]+CtrlCode[3]='show' alors
commencer {Les 4 premiers chiffres du code de contrôle sont "show", indiquant que l'ordinateur hôte a émis une commande de capture d'écran}
si BmpStream.Size=0 alors {Aucune donnée ne peut être envoyée, des captures d'écran doivent être prises pour générer des données}
commencer
TmpStr:=StrPas(CtrlCode);
TmpStr:=Copie(TmpStr,5,Longueur(TmpStr)-4);
LeftPos:=StrToInt(Copie(TmpStr,1,Pos(':',TmpStr)-1));
TmpStr:=Copie(TmpStr,Pos(':',TmpStr)+1,Longueur(TmpStr)
-Pos(':',TmpStr));
TopPos:=StrToInt(Copie(TmpStr,1,Pos(':',TmpStr)-1));
TmpStr:=Copie(TmpStr,Pos(':',TmpStr)+1,Longueur(TmpStr)-
Pos(':',TmpStr));
RightPos:=StrToInt(Copy(TmpStr,1,Pos(':',TmpStr)-1));
BottomPos:=StrToInt(Copie(TmpStr,Pos(':',TmpStr
)+1,Longueur(TmpStr)-Pos(':',TmpStr)));
ScreenCap (Pos gauche, Pos haut, Pos droit, Pos bas); {
Prendre une capture d'écran}
fin;
si LeftSize>BufSize alors SendSize:=BufSize
sinon SendSize:=LeftSize;
BmpStream.ReadBuffer(Buf,SendSize);
LeftSize:=LeftSize-SendSize;
si LeftSize=0 alors BmpStream.Clear;{clear stream}
CUDP.RemoteHost:=FromIP ; {FromIP est l'adresse IP de l'hôte}
CUDP.SendBuffer(Buf,SendSize); {Envoyer les données au port 2222 de l'ordinateur hôte}
fin;
fin;
ScreenCap est une fonction personnalisée qui capture la zone spécifiée de l'écran.
Le code est le suivant :
procédure TClient.ScreenCap(LeftPos,TopPos,
RightPos, BottomPos : entier );
var
RectWidth,RectHeight:entier ;
SourceDC,DestDC,Bhandle:entier;
Bitmap : TBitmap ;
commencer
RectWidth :=RightPos-LeftPos ;
RectHeight :=BottomPos-TopPos ;
SourceDC:=CreateDC('DISPLAY',',',nil);
DestDC:=CreateCompatibleDC(SourceDC);
Bhandle :=CreateCompatibleBitmap(SourceDC,
RectWidth, RectHauteur);
SelectObject(DestDC,Bhandle);
BitBlt(DestDC,0,0,RectWidth,RectHeight,SourceDC,
LeftPos,TopPos,SRCCOPY);
Bitmap:=TBitmap.Create;
Bitmap.Handle:=BHandle;
BitMap.SaveToStream(BmpStream);
BmpStream.Position:=0;
LeftSize:=BmpStream.Size;
Bitmap.Gratuit ;
SupprimerDC(DestDC);
ReleaseDC (Bhandle, SourceDC);
fin;
Enregistrez sous "C:VClientClnUnit.pas" et "C:VClientVClient.dpr",
et compiler.
----La deuxième étape consiste à compiler le fichier VServer.exe. Créez un nouveau projet Delphi et définissez la propriété Name du formulaire sur "Serveur". Ajoutez le contrôle TNMUDP, définissez l'attribut Name sur "SUDP" ; définissez l'attribut LocalPort sur "2222", laissez le contrôle SUDP surveiller le port 2222 de l'ordinateur hôte et, lorsque les données sont envoyées au port, déclenchez l'événement OnDataReceived de le SUDP de contrôle ; définissez l'attribut RemotePort sur "1111", lorsque le SUDP de contrôle envoie des données, les données sont envoyées au port 1111 de la machine contrôlée. Ajoutez le contrôle Image1, définissez la propriété Align sur « alClient » ; ajoutez le contrôle Button1, définissez la propriété Caption sur « Screenshot » ; ajoutez le contrôle Label1, définissez la propriété Caption sur « Left : Top : Right : Bottom » ; Entrez le contrôle Edit1 et définissez la propriété Text sur « 0:0:100:100 » ; ajoutez le contrôle Label2 et définissez la propriété Caption sur « Adresse IP de la machine contrôlée » ; ajoutez le contrôle Edit2 et définissez la propriété Text sur « 127.0.0.1 » ;
Ajouter une définition de variable après la mise en œuvre
const TailleBuf=2048 ;
var
RsltStream,TmpStream:TMemoryStream;
Ajoutez du code pour l'événement OnCreate du serveur :
procédure TServer.FormCreate(Expéditeur : TObject);
commencer
RsltStream:=TMemoryStream.Create;
TmpStream:=TMemoryStream.Create;
fin;
Ajoutez du code pour l'événement OnDestroy du client :
procédure TServer.FormDestroy(Expéditeur : TObject);
commencer
RsltStream.Free ;
TmpStream.Free;
fin;
Ajoutez du code pour l'événement OnClick du contrôle Button1 :
procédure TServer.Button1Click(Expéditeur : TObject);
var ReqCode:array[0..29] de char;ReqCodeStr:string;
commencer
ReqCodeStr:='show'+Edit1.Text;
StrpCopy(ReqCode,ReqCodeStr);
TmpStream.Clear;
RsltStream.Clear;
SUDP.RemoteHost:=Edit2.Text;
SUDP.SendBuffer(ReqCode,30);
fin;
Ajoutez du code pour l'événement OnDataReceived du contrôle SUDP :
procédure TServer.SUDPDataReceived(Sender: TComponent;
NombreOctets : Entier ; FromIP : Chaîne );
var ReqCode:array[0..29] de char;ReqCodeStr:string;
commencer
ReqCodeStr:='show'+Edit1.text;
StrpCopy(ReqCode,ReqCodeStr);
SUDP.ReadStream(TmpStream);
RsltStream.CopyFrom(TmpStream,NumberBytes);
si NumberBytes < BufSize alors {les données ont été lues}
commencer
RsltStream.Position:=0;
Image1.Picture.Bitmap.LoadFromStream(RsltStream);
TmpStream.Clear;
RsltStream.Clear;
fin
autre
commencer
TmpStream.Clear;
ReqCode : = 'afficher' ;
SUDP.RemoteHost:=Edit2.Text;
SUDP.SendBuffer(ReqCode,30);
fin;
fin;
Enregistrez sous "C:VServerSvrUnit.pas" et
"C:VServerVServer.dpr" et compilez.
---- 4. Testez.
---- 1. Test de la machine locale : exécutez Vserver.exe et VClient.exe en même temps sur la machine locale et utilisez les paramètres par défaut du programme pour prendre des captures d'écran. Vérifiez "Panneau de configuration" - "Réseau" - "TCP/IP" - "Adresse IP", définissez l'"Adresse IP client" du programme sur cette adresse et il fonctionnera normalement.
---- 2. Test à distance : sélectionnez une machine contrôlée, exécutez VClient.exe ; sélectionnez une autre machine maître, exécutez VServer.exe et définissez « l'adresse IP de la machine contrôlée », c'est-à-dire le contenu d'Edit2, comme contrôlé. Adresse IP de la machine et "prendre une capture d'écran". Ce qui précède présente brièvement la méthode de mise en œuvre de la capture d'écran à distance. Quant à la surveillance simultanée de plusieurs machines contrôlées sur un seul écran de la machine de contrôle principale, les lecteurs peuvent l'améliorer eux-mêmes. Le programme ci-dessus a été débogué et passé sous le réseau peer-to-peer Windows98 et Delphi 4.0.