تنفيذ التقاط الشاشة عن بعد باستخدام دلفي
شركة شاندونغ جولي المحدودة مركز CAD
تان جيكين
---- في إدارة الشبكة، من الضروري أحيانًا فهم استخدام أجهزة الكمبيوتر المتصلة بالإنترنت من خلال مراقبة شاشة الكمبيوتر البعيد. على الرغم من وجود العديد من البرامج في السوق التي يمكنها تحقيق هذه الوظيفة، بل ويمكن لبعضها إجراء التحكم عن بعد، إلا أنها تفتقر إلى المرونة في الاستخدام، على سبيل المثال، لا يمكنها تحديد حجم وموضع مساحة شاشة الكمبيوتر عن بعد، وبالتالي لا يمكنها مراقبة عدة أجهزة شاشات على شاشة واحدة في نفس الوقت . في الواقع، يمكنك استخدام دلفي لتجميع أداة مرنة لالتقاط الشاشة عن بعد، والتي تم وصفها بإيجاز على النحو التالي.
---- 1. متطلبات البرامج والأجهزة.
---- شبكة نظير إلى نظير Windows95/98، يجب أن يكون الكمبيوتر المستخدم للمراقبة (يشار إليه فيما يلي باسم الكمبيوتر الرئيسي) والكمبيوتر الذي تتم مراقبته (يشار إليه فيما يلي باسم الكمبيوتر الذي يتم التحكم فيه) مزودًا بـ TCP/ip البروتوكول وتكوينه بشكل صحيح. إذا لم تكن هناك شبكة، يمكنك أيضًا تصحيح الأخطاء على جهاز الكمبيوتر.
---- 2. طريقة التنفيذ.
---- قم بإعداد تطبيقين، أحدهما VClient.exe، المثبت على الجهاز الذي يتم التحكم فيه، والآخر هو VServer.exe، المثبت على جهاز التحكم الرئيسي. يحدد VServer.exe عنوان IP الخاص بالجهاز الذي يتم التحكم فيه ليتم مراقبته وحجم وموضع المنطقة التي سيتم التقاطها على شاشة الجهاز الذي يتم التحكم فيه، ويصدر تعليمات التقاط الشاشة إلى VClient.exe بعد تلقي التعليمات .exe حدد منطقة معينة على شاشة الكمبيوتر، وقم بإنشاء دفق بيانات، وأرسله مرة أخرى إلى الكمبيوتر المضيف، واعرض صورة BMP للمنطقة الملتقطة على الكمبيوتر المضيف. يمكن أن نرى من العملية المذكورة أعلاه أن هناك مفتاحين لهذه الطريقة: أحدهما هو كيفية التقاط الشاشة على الجهاز الذي يتم التحكم فيه، والآخر هو كيفية نقل البيانات بين جهازي الكمبيوتر من خلال بروتوكول TCP/IP.
---- UDP (User Datagram PROtocol، ويعني بروتوكول رسالة المستخدم) هو أحد بروتوكولات الاتصال المستخدمة على نطاق واسع على الإنترنت. يختلف عن بروتوكول TCP، فهو بروتوكول نقل بدون اتصال بدون آلية تأكيد ولا يمكن الاعتماد عليه مثل TCP، ولكنه أكثر كفاءة من TCP وأكثر ملاءمة لمراقبة الشاشة عن بعد. في الوقت نفسه، لا يميز عنصر تحكم UDP بين الخادم والعميل، فقط الطرف المرسل والطرف المتلقي. البرمجة بسيطة نسبيًا، لذلك يتم تحديد بروتوكول UDP واستخدام عنصر التحكم TNMUDP المقدم من Delphi 4.0.
---- 3. إنشاء برنامج توضيحي.
----الخطوة الأولى هي تجميع ملف VClient.exe. قم بإنشاء مشروع دلفي جديد وقم بتعيين خاصية الاسم للنموذج الافتراضي على "العميل". أضف عنصر التحكم TNMUDP، وقم بتعيين سمة الاسم على "CUDP"؛ وقم بتعيين سمة LocalPort على "1111"، واسمح لعنصر التحكم CUDP بمراقبة منفذ 1111 للجهاز الذي يتم التحكم فيه، وعندما يتم إرسال البيانات إلى المنفذ، قم بتشغيل حدث OnDataReceived لـ يقوم عنصر التحكم CUDP بتعيين سمة RemotePort على "2222"، وعندما يرسل عنصر التحكم CUDP البيانات، يتم إرسال البيانات إلى منفذ 2222 للكمبيوتر المضيف.
---- إضافة تعريف المتغير بعد التنفيذ
const BufSize=2048;{حجم المخزن المؤقت لإرسال كل جزء من البيانات}
فار
BmpStream:TMemoryStream;
LeftSize:Longint;{عدد البايتات المتبقية بعد إرسال كل جزء من البيانات}
أضف رمزًا لحدث OnCreate الخاص بالعميل:
الإجراء TClient.FormCreate(Sender: TObject);
يبدأ
BmpStream:=TMemoryStream.Create;
نهاية؛
أضف رمزًا لحدث OnDestroy الخاص بالعميل:
الإجراء TClient.FormDestroy(Sender: TObject);
يبدأ
BmpStream.Free;
نهاية؛
أضف التعليمات البرمجية للحدث OnDataReceived لعنصر التحكم CUDP:
الإجراء TClient.CUDPDataReceived(Sender: TComponent;
NumberBytes: عدد صحيح؛
فار
CtrlCode:array[0..29] of char;
Buf:array[0..BufSize-1] of char;
TmpStr: سلسلة؛
SendSize، LeftPos، TopPos، RightPos، BottomPos: عدد صحيح؛
يبدأ
CUDP.ReadBuffer(CtrlCode,NumberBytes);{اقرأ رمز التحكم}
إذا كان CtrlCode[0]+CtrlCode[1]+CtrlCode[2]+CtrlCode[3]='show' إذن
ابدأ {الأرقام الأربعة الأولى من رمز التحكم هي "إظهار"، مما يشير إلى أن الكمبيوتر المضيف قد أصدر أمرًا لالتقاط الشاشة}
إذا كان BmpStream.Size=0، فعندئذٍ {لا يمكن إرسال أي بيانات، ويجب التقاط لقطات الشاشة لإنشاء البيانات}
يبدأ
TmpStr:=StrPas(CtrlCode);
TmpStr:=Copy(TmpStr,5,Length(TmpStr)-4);
LeftPos:=StrToInt(Copy(TmpStr,1,Pos(':',TmpStr)-1));
TmpStr:=نسخ(TmpStr,Pos(':',TmpStr)+1,Length(TmpStr)
-Pos(':',TmpStr));
TopPos:=StrToInt(Copy(TmpStr,1,Pos(':',TmpStr)-1));
TmpStr:=نسخ(TmpStr,Pos(':',TmpStr)+1,Length(TmpStr)-
نقاط البيع(':',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);
التقط لقطة شاشة}
نهاية؛
إذا LeftSize>BufSize ثم SendSize:=BufSize
else 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:عدد صحيح)؛
فار
RectWidth,RectHeight:integer;
SourceDC,DestDC,Bhandle:integer;
الصورة النقطية:TBitmap;
يبدأ
RectWidth:=RightPos-LeftPos;
RectHeight:=BottomPos-TopPos;
SourceDC:=CreateDC('DISPLAY',',',nil);
DestDC:=CreateCompatibleDC(SourceDC);
Bhandle:=CreateCompatibleBitmap(SourceDC,
RectWidth،RectHeight)؛
SelectObject(DestDC,Bhandle);
BitBlt(DestDC,0,0,RectWidth,RectHeight,SourceDC,
LeftPos، TopPos، SRCCOPY)؛
الصورة النقطية:=TBitmap.Create;
Bitmap.Handle:=BHandle;
BitMap.SaveToStream(BmpStream);
BmpStream.Position:=0;
LeftSize:=BmpStream.Size;
Bitmap.Free;
DeleteDC(DestDC);
ReleaseDC(Bhandle,SourceDC);
نهاية؛
احفظ باسم "C:VClientClnUnit.pas" و"C:VClientVClient.dpr"،
وتجميع.
----الخطوة الثانية هي تجميع ملف VServer.exe. قم بإنشاء مشروع دلفي جديد وقم بتعيين خاصية اسم النموذج على "الخادم". أضف عنصر التحكم TNMUDP، وقم بتعيين سمة الاسم على "SUDP"؛ وقم بتعيين سمة LocalPort على "2222"، واسمح لعنصر التحكم SUDP بمراقبة منفذ 2222 للكمبيوتر المضيف، وعندما يتم إرسال البيانات إلى المنفذ، قم بتشغيل حدث OnDataReceived لـ يقوم عنصر التحكم SUDP بتعيين سمة RemotePort على "1111"، وعندما يرسل عنصر التحكم SUDP البيانات، يتم إرسال البيانات إلى منفذ 1111 للجهاز الذي يتم التحكم فيه. أضف عنصر التحكم Image1، واضبط خاصية المحاذاة على "alClient"؛ وأضف عنصر التحكم Button1، واضبط خاصية Caption على "Screenshot"؛ وأضف عنصر التحكم Label1، واضبط خاصية Caption على "Left: Top: Right: Bottom"؛ أدخل عنصر التحكم Edit1 وقم بتعيين خاصية النص على "0:0:100:100"؛ وأضف عنصر التحكم Label2 وقم بتعيين خاصية التسمية التوضيحية على "عنوان IP للجهاز الذي يتم التحكم فيه"؛
إضافة تعريف المتغير بعد التنفيذ
const BufSize=2048;
فار
RsltStream,TmpStream:TMemoryStream;
إضافة رمز لحدث OnCreate الخاص بالخادم:
الإجراء TServer.FormCreate(Sender: TObject);
يبدأ
RsltStream:=TMemoryStream.Create;
TmpStream:=TMemoryStream.Create;
نهاية؛
أضف رمزًا لحدث OnDestroy الخاص بالعميل:
الإجراء TServer.FormDestroy(Sender: TObject);
يبدأ
RsltStream.Free;
TmpStream.Free;
نهاية؛
إضافة رمز لحدث OnClick لعنصر التحكم Button1:
الإجراء TServer.Button1Click(Sender: TObject);
var ReqCode:array[0..29] of char;ReqCodeStr:string;
يبدأ
ReqCodeStr:='show'+Edit1.Text;
StrpCopy(ReqCode,ReqCodeStr);
TmpStream.Clear;
RsltStream.Clear;
SUDP.RemoteHost:=Edit2.Text;
SUDP.SendBuffer(ReqCode,30);
نهاية؛
أضف التعليمات البرمجية للحدث OnDataReceived لعنصر التحكم SUDP:
الإجراء TServer.SUDPDataReceived(Sender: TComponent;
NumberBytes: عدد صحيح؛
var ReqCode:array[0..29] of char;ReqCodeStr:string;
يبدأ
ReqCodeStr:='show'+Edit1.text;
StrpCopy(ReqCode,ReqCodeStr);
SUDP.ReadStream(TmpStream);
RsltStream.CopyFrom(TmpStream,NumberBytes);
إذا كان NumberBytes< BufSize ثم {تمت قراءة البيانات}
يبدأ
RsltStream.Position:=0;
Image1.Picture.Bitmap.LoadFromStream(RsltStream);
TmpStream.Clear;
RsltStream.Clear;
نهاية
آخر
يبدأ
TmpStream.Clear;
ReqCode:='show';
SUDP.RemoteHost:=Edit2.Text;
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.