การใช้งานการจับภาพหน้าจอระยะไกลโดยใช้ Delphi
มณฑลซานตง Juli Co., Ltd. ศูนย์ CAD
ตันเกอจิน
---- ในการจัดการเครือข่าย บางครั้งจำเป็นต้องเข้าใจการใช้งานคอมพิวเตอร์ออนไลน์โดยการตรวจสอบหน้าจอคอมพิวเตอร์ระยะไกล แม้ว่าจะมีซอฟต์แวร์จำนวนมากในตลาดที่สามารถใช้งานฟังก์ชั่นนี้ได้ และบางตัวยังสามารถควบคุมระยะไกลได้ แต่ก็ขาดความยืดหยุ่นในการใช้งาน ตัวอย่างเช่น ไม่สามารถระบุขนาดและตำแหน่งของพื้นที่หน้าจอคอมพิวเตอร์ระยะไกลได้ ดังนั้นจึงไม่สามารถตรวจสอบหลาย ๆ อันได้ บนหน้าจอเดียวในเวลาเดียวกัน ในความเป็นจริง คุณสามารถใช้ Delphi เพื่อรวบรวมเครื่องมือจับภาพหน้าจอระยะไกลแบบยืดหยุ่นได้ ซึ่งมีคำอธิบายสั้นๆ ดังต่อไปนี้
---- 1. ข้อกำหนดด้านซอฟต์แวร์และฮาร์ดแวร์
---- เครือข่ายเพียร์ทูเพียร์ Windows95/98 คอมพิวเตอร์ที่ใช้ในการตรวจสอบ (ต่อไปนี้จะเรียกว่าคอมพิวเตอร์หลัก) และคอมพิวเตอร์ที่ถูกตรวจสอบ (ต่อไปนี้จะเรียกว่าคอมพิวเตอร์ควบคุม) จะต้องติดตั้ง TCP/ip โปรโตคอลและกำหนดค่าอย่างถูกต้อง หากไม่มีเครือข่าย คุณสามารถตรวจแก้จุดบกพร่องบนคอมพิวเตอร์ได้เช่นกัน
---- 2. วิธีการนำไปปฏิบัติ
---- เตรียมสองแอพพลิเคชั่น ตัวแรกคือ VClient.exe ติดตั้งบนเครื่องที่ควบคุม และอีกตัวคือ VServer.exe ที่ติดตั้งบนเครื่องควบคุมหลัก VServer.exe ระบุที่อยู่ IP ของเครื่องควบคุมที่จะตรวจสอบ รวมถึงขนาดและตำแหน่งของพื้นที่ที่จะบันทึกบนหน้าจอของเครื่องควบคุม และออกคำสั่งการจับภาพหน้าจอไปยัง VClient.exe หลังจากได้รับคำสั่ง VClient .exe เลือกพื้นที่ที่กำหนดบนหน้าจอคอมพิวเตอร์ สร้างสตรีมข้อมูล ส่งกลับไปยังคอมพิวเตอร์โฮสต์ และแสดงภาพ BMP ของพื้นที่ที่บันทึกบนคอมพิวเตอร์โฮสต์ จากกระบวนการข้างต้นจะเห็นได้ว่ามีสองคีย์สำหรับวิธีนี้: วิธีแรกคือวิธีจับภาพหน้าจอบนเครื่องที่ควบคุม และอีกวิธีคือวิธีส่งข้อมูลระหว่างคอมพิวเตอร์ทั้งสองเครื่องผ่านโปรโตคอล TCP/IP
---- UDP (User Datagram PROtocol หมายถึง User Message Protocol) เป็นหนึ่งในโปรโตคอลการสื่อสารที่ใช้กันอย่างแพร่หลายบนอินเทอร์เน็ต แตกต่างจากโปรโตคอล TCP คือเป็นโปรโตคอลการส่งข้อมูลที่ไม่มีการเชื่อมต่อโดยไม่มีกลไกการยืนยัน และไม่น่าเชื่อถือเท่ากับ TCP แต่มีประสิทธิภาพมากกว่า TCP และเหมาะสำหรับการตรวจสอบหน้าจอระยะไกลมากกว่า ในเวลาเดียวกัน การควบคุม UDP จะไม่แยกความแตกต่างระหว่างเซิร์ฟเวอร์และไคลเอนต์ มีเพียงส่วนปลายการส่งและส่วนรับเท่านั้น การเขียนโปรแกรมค่อนข้างง่าย ดังนั้นจึงเลือกโปรโตคอล UDP และใช้การควบคุม TNMUDP ที่ Delphi 4.0 มอบให้
---- 3.สร้างโปรแกรมสาธิต
----ขั้นตอนแรกคือการคอมไพล์ไฟล์ VClient.exe สร้างโครงการ Delphi ใหม่และตั้งค่าคุณสมบัติ Name ของแบบฟอร์มเริ่มต้นเป็น "Client" เพิ่มตัวควบคุม TNMUDP ตั้งค่าแอตทริบิวต์ Name เป็น "CUDP" ตั้งค่าแอตทริบิวต์ LocalPort เป็น "1111" ให้ตัวควบคุม CUDP ตรวจสอบพอร์ต 1111 ของเครื่องที่ควบคุม และเมื่อข้อมูลถูกส่งไปยังพอร์ต ให้ทริกเกอร์เหตุการณ์ OnDataReceived ของ CUDP ควบคุม ตั้งค่าแอตทริบิวต์ RemotePort เป็น "2222" เมื่อ CUDP ควบคุมส่งข้อมูลข้อมูลจะถูกส่งไปยังพอร์ต 2222 ของคอมพิวเตอร์โฮสต์
---- เพิ่มคำจำกัดความของตัวแปรหลังการใช้งาน
const BufSize=2048;{ขนาดบัฟเฟอร์สำหรับการส่งข้อมูลแต่ละชิ้น}
var
BmpStream:TMemoryStream;
LeftSize:Longint;{จำนวนไบต์ที่เหลือหลังจากส่งข้อมูลแต่ละชิ้น}
เพิ่มโค้ดสำหรับเหตุการณ์ OnCreate ของลูกค้า:
ขั้นตอน TClient.FormCreate (ผู้ส่ง: TObject);
เริ่ม
BmpStream:=TMemoryStream.Create;
จบ;
เพิ่มโค้ดสำหรับเหตุการณ์ OnDestroy ของลูกค้า:
ขั้นตอน TClient.FormDestroy (ผู้ส่ง: TObject);
เริ่ม
BmpStream.ฟรี;
จบ;
เพิ่มรหัสสำหรับเหตุการณ์ OnDataReceived ของตัวควบคุม CUDP:
ขั้นตอน TClient.CUDPDataReceived (ผู้ส่ง: TComponent;
NumberBytes: จำนวนเต็ม; FromIP: สตริง);
var
CtrlCode:array[0..29] ของถ่าน;
Buf:array[0..BufSize-1] ของถ่าน;
TmpStr: สตริง;
SendSize, LeftPos, TopPos, RightPos, BottomPos: จำนวนเต็ม;
เริ่ม
CUDP.ReadBuffer(CtrlCode,NumberBytes);{อ่านรหัสควบคุม}
ถ้า CtrlCode[0]+CtrlCode[1]+CtrlCode[2]+CtrlCode[3]='show' แล้ว
เริ่มต้น {รหัสควบคุม 4 หลักแรกคือ "แสดง" ซึ่งระบุว่าคอมพิวเตอร์โฮสต์ได้ออกคำสั่งจับภาพหน้าจอ}
ถ้า BmpStream.Size=0 ดังนั้น {ไม่สามารถส่งข้อมูลได้ ต้องถ่ายภาพหน้าจอเพื่อสร้างข้อมูล}
เริ่ม
TmpStr:=StrPas(CtrlCode);
TmpStr:=คัดลอก(TmpStr,5,ความยาว(TmpStr)-4);
LeftPos:=StrToInt(คัดลอก(TmpStr,1,Pos(':',TmpStr)-1));
TmpStr:=คัดลอก(TmpStr,Pos(':',TmpStr)+1,ความยาว(TmpStr)
-Pos(':',TmpStr));
TopPos:=StrToInt(คัดลอก(TmpStr,1,Pos(':',TmpStr)-1));
TmpStr:=คัดลอก(TmpStr,Pos(':',TmpStr)+1,ความยาว(TmpStr)-
Pos(':',TmpStr));
RightPos:=StrToInt(คัดลอก(TmpStr,1,Pos(':',TmpStr)-1));
BottomPos:=StrToInt(คัดลอก(TmpStr,Pos(':',TmpStr
)+1,ความยาว(TmpStr)-Pos(':',TmpStr)));
ScreenCap(LeftPos,TopPos,ขวาPos,BottomPos); {
ถ่ายภาพหน้าจอ}
จบ;
ถ้า LeftSize>BufSize แล้ว SendSize:=BufSize
อย่างอื่น SendSize:=LeftSize;
BmpStream.ReadBuffer(Buf,SendSize);
LeftSize:=LeftSize-SendSize;
ถ้า LeftSize=0 แล้ว BmpStream.Clear; {ล้างสตรีม}
CUDP.RemoteHost:=FromIP; {FromIP คือที่อยู่ IP ของโฮสต์}
CUDP.SendBuffer(Buf,SendSize); {ส่งข้อมูลไปยังพอร์ต 2222 ของคอมพิวเตอร์โฮสต์}
จบ;
จบ;
ScreenCap เป็นฟังก์ชันแบบกำหนดเองที่จับภาพพื้นที่ที่กำหนดของหน้าจอ
รหัสมีดังนี้:
ขั้นตอน TClient.ScreenCap (LeftPos, TopPos,
RightPos, BottomPos: จำนวนเต็ม);
var
RectWidth, RectHeight: จำนวนเต็ม;
SourceDC, DestDC, Bhandle: จำนวนเต็ม;
บิตแมป:TBitmap;
เริ่ม
RectWidth:=RightPos-LeftPos;
RectHeight:=BottomPos-TopPos;
SourceDC:=CreateDC('DISPLAY',',',nil);
DestDC:=CreateCompatibleDC(SourceDC);
Bhandle:=สร้างบิตแมปที่เข้ากันได้(SourceDC,
ความกว้างตรง, ความสูงตรง);
เลือกวัตถุ(DestDC,Bhandle);
BitBlt(DestDC,0,0,RectWidth,RectHeight,SourceDC,
ตำแหน่งซ้าย, TopPos, SRCCOPY);
บิตแมป:=TBitmap.Create;
บิตแมป.Handle:=BHandle;
BitMap.SaveToStream(BmpStream);
BmpStream.ตำแหน่ง:=0;
LeftSize:=BmpStream.Size;
บิตแมปฟรี;
ลบDC(DestDC);
ReleaseDC (Bhandle, SourceDC);
จบ;
บันทึกเป็น "C:VClientClnUnit.pas" และ "C:VClientVClient.dpr"
และคอมไพล์
---- ขั้นตอนที่สองคือการคอมไพล์ไฟล์ VServer.exe สร้างโครงการ Delphi ใหม่และตั้งค่าคุณสมบัติ Name ของแบบฟอร์มเป็น "Server" เพิ่มตัวควบคุม TNMUDP ตั้งค่าแอตทริบิวต์ Name เป็น "SUDP" ตั้งค่าแอตทริบิวต์ LocalPort เป็น "2222" ให้ตัวควบคุม SUDP ตรวจสอบพอร์ต 2222 ของคอมพิวเตอร์โฮสต์ และเมื่อข้อมูลถูกส่งไปยังพอร์ต ให้ทริกเกอร์เหตุการณ์ OnDataReceived ของ SUDP ควบคุม ตั้งค่าแอตทริบิวต์ RemotePort เป็น "1111" เมื่อ SUDP ควบคุมส่งข้อมูลข้อมูลจะถูกส่งไปยังพอร์ต 1111 ของเครื่องควบคุม เพิ่มตัวควบคุม Image1 ตั้งค่าคุณสมบัติ Align เป็น "alClient"; เพิ่มตัวควบคุม Button1 ตั้งค่าคุณสมบัติคำบรรยายเป็น "ภาพหน้าจอ"; เพิ่มตัวควบคุม Label1 ตั้งค่าคุณสมบัติคำบรรยายเป็น "ซ้าย: บน: ขวา: ล่าง" ป้อนการควบคุม Edit1 และตั้งค่าคุณสมบัติข้อความเป็น "0:0:100:100" เพิ่มการควบคุม Label2 และตั้งค่าคุณสมบัติคำอธิบายภาพเป็น "ที่อยู่ IP ของเครื่องควบคุม"; เพิ่มการควบคุม Edit2 และตั้งค่าคุณสมบัติข้อความเป็น "127.0.0.1";
เพิ่มคำจำกัดความของตัวแปรหลังการใช้งาน
const BufSize=2048;
var
RsltStream,TmpStream:TMemoryStream;
เพิ่มรหัสสำหรับเหตุการณ์ OnCreate ของเซิร์ฟเวอร์:
ขั้นตอน TServer.FormCreate (ผู้ส่ง: TObject);
เริ่ม
RsltStream:=TMemoryStream.Create;
TmpStream:=TMemoryStream.Create;
จบ;
เพิ่มโค้ดสำหรับเหตุการณ์ OnDestroy ของลูกค้า:
ขั้นตอน TServer.FormDestroy (ผู้ส่ง: TObject);
เริ่ม
RsltStream.ฟรี;
TmpStream.ฟรี;
จบ;
เพิ่มรหัสสำหรับเหตุการณ์ OnClick ของตัวควบคุม Button1:
ขั้นตอน TServer.Button1Click (ผู้ส่ง: TObject);
var ReqCode:array[0..29] ของ char;ReqCodeStr:string;
เริ่ม
ReqCodeStr:='show'+Edit1.Text;
StrpCopy(ReqCode,ReqCodeStr);
TmpStream.เคลียร์;
RsltStream.เคลียร์;
SUDP.RemoteHost:=แก้ไข2.ข้อความ;
SUDP.SendBuffer(ReqCode,30);
จบ;
เพิ่มรหัสสำหรับเหตุการณ์ OnDataReceived ของตัวควบคุม SUDP:
ขั้นตอน TServer.SUDPDataReceived (ผู้ส่ง: TComponent;
NumberBytes: จำนวนเต็ม; FromIP: สตริง);
var ReqCode:array[0..29] ของ char;ReqCodeStr:string;
เริ่ม
ReqCodeStr:='show'+Edit1.text;
StrpCopy(ReqCode,ReqCodeStr);
SUDP.ReadStream(TmpStream);
RsltStream.CopyFrom(TmpStream,NumberBytes);
ถ้า NumberBytes< BufSize แสดงว่า {data ถูกอ่านแล้ว}
เริ่ม
RsltStream.ตำแหน่ง:=0;
Image1.Picture.Bitmap.LoadFromStream (RsltStream);
TmpStream.เคลียร์;
RsltStream.เคลียร์;
จบ
อื่น
เริ่ม
TmpStream.เคลียร์;
ReqCode:='show';
SUDP.RemoteHost:=แก้ไข2.ข้อความ;
SUDP.SendBuffer(ReqCode,30);
จบ;
จบ;
บันทึกเป็น "C:VServerSvrUnit.pas" และ
"C:VServerVServer.dpr" และคอมไพล์
---- 4. การทดสอบ
---- 1. การทดสอบเครื่องท้องถิ่น: เรียกใช้ Vserver.exe และ VClient.exe พร้อมกันบนเครื่องท้องถิ่น และใช้การตั้งค่าเริ่มต้นของโปรแกรมเพื่อจับภาพหน้าจอ ตรวจสอบ "แผงควบคุม" - "เครือข่าย" - "TCP/IP" - "ที่อยู่ IP" ตั้งค่า "ที่อยู่ IP ของลูกค้า" ของโปรแกรมเป็นที่อยู่นี้ และโปรแกรมจะทำงานได้ตามปกติ
---- 2. การทดสอบระยะไกล: เลือกเครื่องที่ควบคุม รัน VClient.exe เลือกเครื่องหลักอื่น รัน VServer.exe และตั้งค่า "ที่อยู่ IP ของเครื่องที่ควบคุม" นั่นคือเนื้อหาของ Edit2 ตามที่ควบคุม ที่อยู่ IP ของเครื่องและ "ถ่ายภาพหน้าจอ" ข้างต้นจะแนะนำวิธีการจับภาพหน้าจอระยะไกลโดยย่อ สำหรับการตรวจสอบเครื่องที่ควบคุมหลายเครื่องพร้อมกันบนหน้าจอเดียวบนเครื่องควบคุมหลัก ผู้อ่านสามารถปรับปรุงได้ด้วยตัวเอง โปรแกรมข้างต้นได้รับการดีบั๊กและส่งต่อภายใต้เครือข่ายเพียร์ทูเพียร์ Windows98 และ Delphi 4.0