Menerapkan tangkapan layar jarak jauh menggunakan Delphi
Shandong Juli Co, Ltd Pusat CAD
Tan Geqin
---- Dalam manajemen jaringan, terkadang perlu untuk memahami penggunaan komputer online dengan memantau layar komputer jarak jauh. Meskipun ada banyak perangkat lunak di pasaran yang dapat mencapai fungsi ini, dan beberapa bahkan dapat melakukan kendali jarak jauh, perangkat lunak tersebut kurang fleksibel dalam penggunaannya, misalnya, perangkat lunak tersebut tidak dapat menentukan ukuran dan posisi area layar komputer jarak jauh, sehingga tidak dapat memantau banyak hal layar pada satu layar secara bersamaan. Faktanya, Anda dapat menggunakan Delphi untuk mengkompilasi alat tangkapan layar jarak jauh yang fleksibel, yang dijelaskan secara singkat sebagai berikut.
---- 1. Persyaratan perangkat lunak dan perangkat keras.
---- Jaringan peer-to-peer Windows95/98, komputer yang digunakan untuk pemantauan (selanjutnya disebut komputer master) dan komputer yang dipantau (selanjutnya disebut komputer yang dikontrol) harus dilengkapi dengan TCP/ip protokol dan dikonfigurasi dengan benar. Jika tidak ada jaringan, Anda juga dapat melakukan debug di komputer.
---- 2. Metode pelaksanaan.
---- Siapkan dua aplikasi, satu adalah VClient.exe, diinstal pada mesin yang dikontrol, dan yang lainnya adalah VServer.exe, diinstal pada mesin kontrol utama. VServer.exe menentukan alamat IP mesin yang dikontrol yang akan dipantau dan ukuran serta posisi area yang akan ditangkap di layar mesin yang dikontrol, dan mengeluarkan instruksi tangkapan layar ke VClient.exe Setelah menerima instruksi, VClient .exe Pilih area tertentu di layar komputer, buat aliran data, kirimkan kembali ke komputer host, dan tampilkan gambar BMP dari area yang diambil di komputer host. Terlihat dari proses di atas bahwa ada dua kunci dari metode ini: yang pertama adalah cara menangkap layar pada mesin yang dikendalikan, dan yang lainnya adalah cara mengirimkan data antara dua komputer melalui protokol TCP/IP.
---- UDP (User Datagram PROtocol, artinya User Message Protocol) adalah salah satu protokol komunikasi yang banyak digunakan di Internet. Berbeda dengan protokol TCP, ini adalah protokol transmisi non-koneksi tanpa mekanisme konfirmasi dan tidak dapat diandalkan seperti TCP, namun lebih efisien daripada TCP dan lebih cocok untuk pemantauan layar jarak jauh. Pada saat yang sama, kontrol UDP tidak membedakan antara server dan klien, hanya ujung pengirim dan ujung penerima. Pemrogramannya relatif sederhana, sehingga protokol UDP dipilih dan kontrol TNMUDP yang disediakan oleh Delphi 4.0 digunakan.
---- 3. Membuat program demonstrasi.
----Langkah pertama adalah mengkompilasi file VClient.exe. Buat proyek Delphi baru dan atur properti Nama dari formulir default ke "Klien". Tambahkan kontrol TNMUDP, atur atribut Nama ke "CUDP"; atur atribut LocalPort ke "1111", biarkan kontrol CUDP memantau port 1111 dari mesin yang dikontrol, dan ketika data dikirim ke port, picu kejadian OnDataReceived dari kontrol CUDP; mengatur atribut RemotePort adalah "2222", ketika CUDP kontrol mengirim data, data dikirim ke port 2222 komputer host.
---- Tambahkan definisi variabel setelah implementasi
const BufSize=2048;{Ukuran buffer untuk mengirim setiap bagian data}
var
BmpStream:TMemoryStream;
LeftSize:Longint;{Jumlah byte yang tersisa setelah pengiriman setiap bagian data}
Tambahkan kode untuk acara OnCreate Klien:
procedure TClient.FormCreate(Pengirim: TObject);
mulai
BmpStream:=TMemoryStream.Buat;
akhir;
Tambahkan kode untuk acara OnDestroy Klien:
prosedur TClient.FormDestroy(Pengirim: TObject);
mulai
BmpStream.Gratis;
akhir;
Tambahkan kode untuk kejadian OnDataReceived pada kontrol CUDP:
procedure TClient.CUDPDataReceived(Pengirim: TComponent;
NomorBytes: Integer; DariIP: String);
var
CtrlCode:array[0..29] dari char;
Buf:array[0..BufSize-1] dari char;
TmpStr: rangkaian;
SendSize,Pos Kiri,Pos Atas,Pos Kanan,Pos Bawah:integer;
mulai
CUDP.ReadBuffer(CtrlCode,NumberBytes);{Baca kode kontrol}
jika CtrlCode[0]+CtrlCode[1]+CtrlCode[2]+CtrlCode[3]='tampilkan' maka
mulai {4 digit pertama dari kode kontrol adalah "tampilkan", menunjukkan bahwa komputer host telah mengeluarkan perintah tangkapan layar}
if BmpStream.Size=0 maka {Tidak ada data yang dapat dikirim, tangkapan layar harus diambil untuk menghasilkan data}
mulai
TmpStr:=StrPas(CtrlKode);
TmpStr:=Salin(TmpStr,5,Panjang(TmpStr)-4);
LeftPos:=StrToInt(Salin(TmpStr,1,Pos(':',TmpStr)-1));
TmpStr:=Salin(TmpStr,Pos(':',TmpStr)+1,Panjang(TmpStr)
-Pos(':',TmpStr));
TopPos:=StrToInt(Salin(TmpStr,1,Pos(':',TmpStr)-1));
TmpStr:=Salin(TmpStr,Pos(':',TmpStr)+1,Panjang(TmpStr)-
Pos(':',TmpStr));
RightPos:=StrToInt(Salin(TmpStr,1,Pos(':',TmpStr)-1));
Pos Bawah:=StrToInt(Salin(TmpStr,Pos(':',TmpStr
)+1,Panjang(TmpStr)-Pos(':',TmpStr)));
ScreenCap(Pos Kiri,Pos Atas,Pos Kanan,Pos Bawah);
Ambil tangkapan layar}
akhir;
jika LeftSize>BufSize lalu SendSize:=BufSize
else SendSize:=Ukuran Kiri;
BmpStream.ReadBuffer(Buf,SendSize);
LeftSize:=UkuranKiri-Ukuran Kirim;
jika LeftSize=0 maka BmpStream.Clear;{hapus streaming}
CUDP.RemoteHost:=FromIP; {FromIP adalah alamat IP host}
CUDP.SendBuffer(Buf,SendSize); {Kirim data ke port 2222 komputer host}
akhir;
akhir;
ScreenCap adalah fungsi khusus yang menangkap area layar tertentu.
Kodenya adalah sebagai berikut:
prosedur TClient.ScreenCap(LeftPos,TopPos,
Pos Kanan,Pos Bawah:integer);
var
Lebar Persegi,Tinggi Persegi: bilangan bulat;
SumberDC,DestDC,Bhandle:integer;
Bitmap:TBitmap;
mulai
RectWidth:=Pos Kanan-Pos Kiri;
RectHeight:=Pos Bawah-Pos Atas;
SumberDC:=BuatDC('DISPLAY',',',nil);
DestDC:=BuatCompatibleDC(SumberDC);
Bhandle:=CreateCompatibleBitmap(SumberDC,
Lebar Persegi, Tinggi Persegi);
SelectObject(DestDC,Bhandle);
BitBlt(DestDC,0,0,RectWidth,RectHeight,SumberDC,
LeftPos,TopPos,SRCCOPY);
Bitmap:=TBitmap.Buat;
Bitmap.Handle:=BHandle;
BitMap.SaveToStream(BmpStream);
BmpStream.Posisi:=0;
Ukuran Kiri:=BmpStream.Ukuran;
Bitmap.Gratis;
HapusDC(DestDC);
RilisDC(Bhandle,SumberDC);
akhir;
Simpan sebagai "C:VClientClnUnit.pas" dan "C:VClientVClient.dpr",
dan kompilasi.
----Langkah kedua adalah mengkompilasi file VServer.exe. Buat proyek Delphi baru dan atur properti Nama formulir menjadi "Server". Tambahkan kontrol TNMUDP, atur atribut Nama ke "SUDP"; atur atribut LocalPort ke "2222", biarkan kontrol SUDP memantau port 2222 komputer host, dan ketika data dikirim ke port, memicu peristiwa OnDataReceived dari kontrol SUDP; mengatur atribut RemotePort adalah "1111", ketika kontrol SUDP mengirim data, data dikirim ke port 1111 dari mesin yang dikendalikan. Tambahkan kontrol Image1, atur properti Align ke "alClient"; tambahkan kontrol Button1, atur properti Caption ke "Screenshot"; tambahkan kontrol Label1, atur properti Caption ke "Left: Top: Right: Bottom"; Masukkan kontrol Edit1 dan atur properti Teks ke "0:0:100:100"; tambahkan kontrol Label2 dan atur properti Caption ke "alamat IP mesin yang dikontrol" tambahkan kontrol Edit2 dan atur properti Teks ke "127.0.0.1";
Tambahkan definisi variabel setelah implementasi
const Ukuran Buf=2048;
var
RsltStream,TmpStream:TMoryStream;
Tambahkan kode untuk acara OnCreate Server:
procedure TServer.FormCreate(Pengirim: TObject);
mulai
RsltStream:=TMemoryStream.Buat;
TmpStream:=TMemoryStream.Buat;
akhir;
Tambahkan kode untuk acara OnDestroy Klien:
prosedur TServer.FormDestroy(Pengirim: TObject);
mulai
RsltStream.Gratis;
TmpStream.Gratis;
akhir;
Tambahkan kode untuk event OnClick pada kontrol Button1:
procedure TServer.Button1Click(Pengirim: TObject);
var ReqCode:array[0..29] dari char;ReqCodeStr:string;
mulai
ReqCodeStr:='tampilkan'+Edit1.Teks;
StrpCopy(ReqCode,ReqCodeStr);
TmpStream.Hapus;
RsltStream.Hapus;
SUDP.RemoteHost:=Edit2.Teks;
SUDP.SendBuffer(ReqCode,30);
akhir;
Tambahkan kode untuk kejadian OnDataReceived pada kontrol SUDP:
procedure TServer.SUDPDataReceived(Pengirim: TComponent;
NomorBytes: Integer; DariIP: String);
var ReqCode:array[0..29] dari char;ReqCodeStr:string;
mulai
ReqCodeStr:='tampilkan'+Edit1.teks;
StrpCopy(ReqCode,ReqCodeStr);
SUDP.ReadStream(TmpStream);
RsltStream.CopyFrom(TmpStream,NumberBytes);
jika NumberBytes< BufSize maka {data telah dibaca}
mulai
RsltStream.Posisi:=0;
Gambar1.Gambar.Bitmap.LoadFromStream(RsltStream);
TmpStream.Hapus;
RsltStream.Hapus;
akhir
kalau tidak
mulai
TmpStream.Hapus;
ReqCode:='tunjukkan';
SUDP.RemoteHost:=Edit2.Teks;
SUDP.SendBuffer(ReqCode,30);
akhir;
akhir;
Simpan sebagai "C:VServerSvrUnit.pas" dan
"C:VServerVServer.dpr" dan kompilasi.
---- 4. Tes.
---- 1. Tes mesin lokal: Jalankan Vserver.exe dan VClient.exe secara bersamaan di mesin lokal, dan gunakan pengaturan default program untuk mengambil tangkapan layar. Periksa "Panel Kontrol" - "Jaringan" - "TCP/IP" - "Alamat IP", atur "Alamat IP Pelanggan" program ke alamat ini, dan program akan berjalan normal.
---- 2. Tes jarak jauh: Pilih mesin yang dikontrol, jalankan VClient.exe, pilih mesin master lain, jalankan VServer.exe, dan atur "alamat IP mesin yang dikontrol", yaitu konten Edit2, seperti yang dikontrol. Alamat IP mesin dan "ambil tangkapan layar". Di atas secara singkat memperkenalkan metode penerapan tangkapan layar jarak jauh. Sedangkan untuk memantau beberapa mesin yang dikontrol secara bersamaan pada satu layar di mesin kontrol utama, pembaca dapat memperbaikinya sendiri. Program di atas telah di-debug dan diteruskan di bawah jaringan peer-to-peer Windows98 dan Delphi 4.0.