Implementierung einer Remote-Bildschirmaufnahme mit Delphi
Shandong Juli Co., Ltd. CAD-Zentrum
Tan Geqin
---- Bei der Netzwerkverwaltung ist es manchmal notwendig, die Nutzung von Online-Computern durch Überwachung des Remote-Computerbildschirms zu verstehen. Obwohl es viele Softwareprogramme auf dem Markt gibt, die diese Funktion erfüllen können, und einige sogar eine Fernsteuerung durchführen können, mangelt es ihnen an Flexibilität bei der Verwendung. Sie können beispielsweise nicht die Größe und Position des Remote-Computerbildschirmbereichs festlegen und daher nicht mehrere überwachen Bildschirme gleichzeitig auf einem Bildschirm anzeigen. Tatsächlich können Sie mit Delphi ein flexibles Remote-Screen-Capture-Tool kompilieren, das im Folgenden kurz beschrieben wird.
---- 1. Software- und Hardwareanforderungen.
---- Windows95/98 Peer-to-Peer-Netzwerk, der zur Überwachung verwendete Computer (im Folgenden als Master-Computer bezeichnet) und der überwachte Computer (im Folgenden als gesteuerter Computer bezeichnet) müssen mit TCP/IP ausgestattet sein Protokoll installiert und korrekt konfiguriert. Wenn kein Netzwerk vorhanden ist, können Sie das Debuggen auch auf einem Computer durchführen.
---- 2. Implementierungsmethode.
---- Bereiten Sie zwei Anwendungen vor, eine ist VClient.exe, die auf dem gesteuerten Computer installiert ist, und die andere ist VServer.exe, die auf dem Hauptsteuerungscomputer installiert ist. VServer.exe gibt die IP-Adresse der zu überwachenden gesteuerten Maschine sowie die Größe und Position des zu erfassenden Bereichs auf dem Bildschirm der gesteuerten Maschine an und gibt nach Erhalt der Anweisung eine Bildschirmaufnahmeanweisung an VClient.exe aus .exe Wählen Sie einen bestimmten Bereich auf dem Computerbildschirm aus, generieren Sie einen Datenstrom, senden Sie ihn an den Host-Computer zurück und zeigen Sie das BMP-Bild des erfassten Bereichs auf dem Host-Computer an. Aus dem obigen Prozess ist ersichtlich, dass es bei dieser Methode zwei Schlüssel gibt: Der eine besteht darin, den Bildschirm auf der gesteuerten Maschine zu erfassen, und der andere darin, wie Daten zwischen den beiden Computern über das TCP/IP-Protokoll übertragen werden.
---- UDP (User Datagram PROtocol, was User Message Protocol bedeutet) ist eines der im Internet weit verbreiteten Kommunikationsprotokolle. Im Gegensatz zum TCP-Protokoll handelt es sich um ein verbindungsfreies Übertragungsprotokoll ohne Bestätigungsmechanismus und ist nicht so zuverlässig wie TCP, aber effizienter als TCP und besser für die Fernüberwachung des Bildschirms geeignet. Gleichzeitig unterscheidet die UDP-Steuerung nicht zwischen dem Server und dem Client, sondern nur zwischen der sendenden Seite und der empfangenden Seite. Die Programmierung ist relativ einfach, daher wird das UDP-Protokoll ausgewählt und die von Delphi 4.0 bereitgestellte TNMUDP-Steuerung verwendet.
---- 3. Erstellen Sie ein Demonstrationsprogramm.
----Der erste Schritt besteht darin, die Datei VClient.exe zu kompilieren. Erstellen Sie ein neues Delphi-Projekt und setzen Sie die Name-Eigenschaft des Standardformulars auf „Client“. Fügen Sie das TNMUDP-Steuerelement hinzu, setzen Sie das Namensattribut auf „CUDP“, setzen Sie das LocalPort-Attribut auf „1111“, lassen Sie das Steuer-CUDP den 1111-Port der gesteuerten Maschine überwachen und lösen Sie das OnDataReceived-Ereignis aus, wenn Daten an den Port gesendet werden Das Steuer-CUDP stellt das RemotePort-Attribut auf „2222“ ein. Wenn das Steuer-CUDP Daten sendet, werden die Daten an den 2222-Port des Host-Computers gesendet.
---- Variablendefinition nach der Implementierung hinzufügen
const BufSize=2048;{Puffergröße zum Senden jedes Datenelements}
var
BmpStream:TMemoryStream;
LeftSize:Longint;{Die Anzahl der verbleibenden Bytes nach dem Senden jedes Datenelements}
Fügen Sie Code für das OnCreate-Ereignis des Clients hinzu:
procedure TClient.FormCreate(Sender: TObject);
beginnen
BmpStream:=TMemoryStream.Create;
Ende;
Fügen Sie Code für das OnDestroy-Ereignis des Clients hinzu:
procedure TClient.FormDestroy(Sender: TObject);
beginnen
BmpStream.Free;
Ende;
Fügen Sie Code für das OnDataReceived-Ereignis des Steuer-CUDP hinzu:
procedure TClient.CUDPDataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String);
var
CtrlCode:array[0..29] of char;
Buf:array[0..BufSize-1] of char;
TmpStr: string;
SendSize,LeftPos,TopPos,RightPos,BottomPos:integer;
beginnen
CUDP.ReadBuffer(CtrlCode,NumberBytes);{Steuercode lesen}
wenn CtrlCode[0]+StrgCode[1]+StrgCode[2]+StrgCode[3]='show' dann
begin {Die ersten 4 Ziffern des Steuercodes lauten „show“ und zeigen an, dass der Host-Computer einen Befehl zur Bildschirmaufnahme ausgegeben hat}
wenn BmpStream.Size=0 dann {Es können keine Daten gesendet werden, Screenshots müssen gemacht werden, um Daten zu generieren}
beginnen
TmpStr:=StrPas(StrgCode);
TmpStr:=Copy(TmpStr,5,Length(TmpStr)-4);
LeftPos:=StrToInt(Copy(TmpStr,1,Pos(':',TmpStr)-1));
TmpStr:=Copy(TmpStr,Pos(':',TmpStr)+1,Length(TmpStr)
-Pos(':',TmpStr));
TopPos:=StrToInt(Copy(TmpStr,1,Pos(':',TmpStr)-1));
TmpStr:=Copy(TmpStr,Pos(':',TmpStr)+1,Length(TmpStr)-
Pos(':',TmpStr));
RightPos:=StrToInt(Copy(TmpStr,1,Pos(':',TmpStr)-1));
BottomPos:=StrToInt(Copy(TmpStr,Pos(':',TmpStr
)+1,Length(TmpStr)-Pos(':',TmpStr)));
ScreenCap(LeftPos,TopPos,RightPos,BottomPos);
Machen Sie einen Screenshot}
Ende;
Wenn LeftSize>BufSize, dann SendSize:=BufSize
sonst SendSize:=LeftSize;
BmpStream.ReadBuffer(Buf,SendSize);
LeftSize:=LeftSize-SendSize;
wenn LeftSize=0 then BmpStream.Clear;{clear stream}
CUDP.RemoteHost:=FromIP; {FromIP ist die Host-IP-Adresse}
CUDP.SendBuffer(Buf,SendSize); {Daten an Port 2222 des Host-Computers senden}
Ende;
Ende;
ScreenCap ist eine benutzerdefinierte Funktion, die den angegebenen Bereich des Bildschirms erfasst.
Der Code lautet wie folgt:
Prozedur TClient.ScreenCap(LeftPos,TopPos,
RightPos,BottomPos:integer);
var
RectWidth,RectHeight:integer;
SourceDC,DestDC,Bhandle:integer;
Bitmap:TBitmap;
beginnen
RectWidth:=RightPos-LeftPos;
RectHeight:=BottomPos-TopPos;
SourceDC:=CreateDC('DISPLAY',',',nil);
DestDC:=CreateCompatibleDC(SourceDC);
Bhhandle:=CreateCompatibleBitmap(SourceDC,
RectWidth,RectHeight);
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.Free;
DeleteDC(DestDC);
ReleaseDC(Bhandle,SourceDC);
Ende;
Speichern als „C:VClientClnUnit.pas“ und „C:VClientVClient.dpr“,
und kompilieren.
----Der zweite Schritt besteht darin, die Datei VServer.exe zu kompilieren. Erstellen Sie ein neues Delphi-Projekt und setzen Sie die Name-Eigenschaft des Formulars auf „Server“. Fügen Sie das TNMUDP-Steuerelement hinzu, setzen Sie das Namensattribut auf „SUDP“, setzen Sie das LocalPort-Attribut auf „2222“, lassen Sie das Steuerelement SUDP den 2222-Port des Hostcomputers überwachen und lösen Sie das OnDataReceived-Ereignis aus, wenn Daten an den Port gesendet werden Das Steuer-SUDP stellt das RemotePort-Attribut auf „1111“ ein. Wenn das Steuer-SUDP Daten sendet, werden die Daten an den 1111-Port der gesteuerten Maschine gesendet. Fügen Sie das Steuerelement „Image1“ hinzu, setzen Sie die Eigenschaft „Align“ auf „alClient“ und fügen Sie die Eigenschaft „Caption“ auf „Screenshot“ hinzu Geben Sie „Control Edit1“ ein und setzen Sie die Eigenschaft „Text“ auf „0:0:100:100“;
Fügen Sie nach der Implementierung eine Variablendefinition hinzu
const BufSize=2048;
var
RsltStream,TmpStream:TMemoryStream;
Fügen Sie Code für das OnCreate-Ereignis des Servers hinzu:
procedure TServer.FormCreate(Sender: TObject);
beginnen
RsltStream:=TMemoryStream.Create;
TmpStream:=TMemoryStream.Create;
Ende;
Fügen Sie Code für das OnDestroy-Ereignis des Clients hinzu:
procedure TServer.FormDestroy(Sender: TObject);
beginnen
RsltStream.Free;
TmpStream.Free;
Ende;
Fügen Sie Code für das OnClick-Ereignis des Steuerelements Button1 hinzu:
procedure TServer.Button1Click(Sender: TObject);
var ReqCode:array[0..29] of char;ReqCodeStr:string;
beginnen
ReqCodeStr:='show'+Edit1.Text;
StrpCopy(ReqCode,ReqCodeStr);
TmpStream.Clear;
RsltStream.Clear;
SUDP.RemoteHost:=Edit2.Text;
SUDP.SendBuffer(ReqCode,30);
Ende;
Fügen Sie Code für das OnDataReceived-Ereignis des Steuer-SUDP hinzu:
procedure TServer.SUDPDataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String);
var ReqCode:array[0..29] of char;ReqCodeStr:string;
beginnen
ReqCodeStr:='show'+Edit1.text;
StrpCopy(ReqCode,ReqCodeStr);
SUDP.ReadStream(TmpStream);
RsltStream.CopyFrom(TmpStream,NumberBytes);
wenn NumberBytes< BufSize dann {Daten wurden gelesen}
beginnen
RsltStream.Position:=0;
Image1.Picture.Bitmap.LoadFromStream(RsltStream);
TmpStream.Clear;
RsltStream.Clear;
Ende
anders
beginnen
TmpStream.Clear;
ReqCode:='show';
SUDP.RemoteHost:=Edit2.Text;
SUDP.SendBuffer(ReqCode,30);
Ende;
Ende;
Speichern Sie als „C:VServerSvrUnit.pas“ und
„C:VServerVServer.dpr“ und kompilieren.
---- 4. Testen.
---- 1. Test des lokalen Computers: Führen Sie Vserver.exe und VClient.exe gleichzeitig auf dem lokalen Computer aus und verwenden Sie die Standardeinstellungen des Programms, um Screenshots zu erstellen. Überprüfen Sie „Systemsteuerung“ – „Netzwerk“ – „TCP/IP“ – „IP-Adresse“, stellen Sie die „Kunden-IP-Adresse“ des Programms auf diese Adresse ein und es wird normal ausgeführt.
---- 2. Remote-Test: Wählen Sie eine kontrollierte Maschine aus, führen Sie VClient.exe aus; wählen Sie eine andere Master-Maschine aus, führen Sie VServer.exe aus und legen Sie die „IP-Adresse der kontrollierten Maschine“, also den Inhalt von Edit2, als kontrolliert fest IP-Adresse der Maschine und „Screenshot machen“. Das Obige stellt kurz die Implementierungsmethode der Remote-Bildschirmerfassung vor. Die gleichzeitige Überwachung mehrerer gesteuerter Maschinen auf einem Bildschirm auf der Hauptsteuerungsmaschine kann von den Lesern selbst verbessert werden. Das obige Programm wurde debuggt und unter Windows98 Peer-to-Peer-Netzwerk und Delphi 4.0 weitergegeben.