بسم الله الرحمن الرحيم
اخوتي الأعزاء اعضاء هذا المنتدى
في البداية احببت ان اوضح لكم سبب طرحي لهذا الموضوع
طبعاً كان السبب هو اني كنت اعلم كم كان شغفكم لمعرفة كيفت التعامل مع البرامج الخارجيه وخاصةالمفتوحة
سواء كان ذلك من حيث الأرسال البيانات لها ام من حيث جلب البيانات منها
والسبب الآخر لطرح هذا الموضوع اني اريد ان ارتقي بمستويات بعضكم الى الأعلى
الأهم من هذا كله ان هذا الموضوع مهم جداً لمعرفة كيفية التعامل مع الويندوز ومعرفة مسيرتها
على العموم
سنبداء الآن الشرح:
طبعاً في تلك العمليات اعني عمليات التعامل مع البرامج الخارجيه يستخدم في الغالب
امر SendMessage وهو يعتمد اعتماداً رئيسياً على ال Handle
اعرف ان البعض منكم لا يعرف ال Handle ولكن لاعليه سأشرح ال Handle بشكل مبسط :
ال Handle عبارة عن رقم يستخدم في الويندوز بشكل عام كعناوين للأشياء
فطبعاً كل برنامج تقوم بشتغيله سيحمل Handle خاص به وكل عنصر في البرنامج ايضاً يحمل Handle
خاص به وطبعاً كل مره يتم فيه تشغيل البرنامج سيتغير رقم ال Handle
هذا بالنسبة للويندوز
اما بالنسبة للبرمجه فال Handle تستخدم لأشياء كثيره من اهمها
هو تخزين البيانات
وهذه هي ال Handle بشكل مبسط
اما الآن فلنكمل الشرح
فكما ذكرت لكم ان SendMessage تستخدم في الوصول الى البرامج المفتوحه في الويندوز عن طريق
رقم ال Handle التابع للبرنامج المفتوح
اليكم هذا المثال على طريقة استخدام ال SendMessage
SendMessage(Hand, WM_CHAR, 1 , 0);
طبعاً كما تلاحظون فأن Hand ترمز الى رقم ال Handle المطلوب و WM_CHAR تعني نوع العملية التي تريد عملها
و في الخانة التي يوجد فيها رقم 1 تقوم بأدخال النص (( ولكن بطريقه اخرى سنذكرها لاحقاً ))
و الخانة التي يوجد بها رقم 0 لاتعني اي شي (( اي اننا لانحتاجها غالباً ))
طبعاً الآن سأذكر العمليات وتصريحاتها :
فكما ذكرت لكم سابقاً ان WM_CHAR ترمز الى نوع العملية
ووضيفة WM_CHAR هي ارسال بيانات ويوجد تصريح آخر وهو WM_GETTEXT ووضيفته هي جلب بيانات
وتوجد هناك تصريحات اخرى كثيره منها مايقوم بجلب الصور وغيرها
وطبعاً ستختلف الأومر المدخله على اختلاف العملية المطلوبه
فمثلاً عندما نختار WM_CHAR فأن الحقل الذي يوجد به الرقم 1 يكون هو مكان النص المطلوب ارساله
وعندما نختار WM_GETTEXT فأن الحقل الذي يوجد به رقم 1 يكون هو مكان سعة النص وهكذا
والآن سنذكر مثال تطبيقي وسنشرحه لكي تتضح لكم الصورة اكثر
procedure Send(const Hand: THandle; const Text: string);
var
i: integer;
begin
if Hand = 0 then
Exit;
if Length(Text) = 0 then
Exit;
for i:= 1 to Length(Text) do
begin
SendMessage(Hand, WM_CHAR, Ord(Text), 0);
end;
end;كما تلاحظ ان Hand يحمل قيمة Handle اي هو ماكن ادخال رقم ال Handle الذي تريد ان ترسل اليه النص
و Text يحمل قيمة string وهو لأدخال النص المطلوب ارساله
طبعاً الآن سأقوم بشرح الكود السابق برمجياً
اولاً في تصريحات ال Procedure قمنا بالتصريح عن قيمة ثابته من نوع Handle وسمينها Hand
والفائده منه هي ان ندخل فيه رقم ال Handle الذي نريد ان نرسل اليه البيانات
وقمنا بالتصريح ايضاً عن قيمة ثابته اخرى تحمل قيمة String وسمينها Text
والفائده منه هو كتابة النص الذي سنرسله الى Handle المحدد
وفي الكود الداخلي قمنا بالتصريح عن متغير integer وسميناه i وسنشرح فائدته لاحقاً
بعدها قمنا بالأشتراط بأن Hand وهي قيمة ال Handle اذا كانت تساوي 0 فأن البرنامج يقوم بأيقاف العملية
ومعنى ذلك انه اذا لم تدخل اي قيمة لل Handle حتى سيم ايقاف العمليات التالية لهذه العملية
وبعدها اشترطنا انه اذا كانت عدد الحروف التي في Text وهي النص الذي نريد ان نرسله تساوي 0 فأن
البرنامج يقوم ايضاً بأيقاف العمليات
وبعدها قمنا بالتصريح عن حقله تزايديه على المتغير i (( الفائده من ذلك ستعرفها بعد قليل )) وطبعاً
تبدا هذه القيمه التزايديه من 1 وتنتهي بعدد الحروف المدخله للرساله
وفي داخل هذه الحلقه قمنا بارسال البيانات بواسطة الأمر SendMessage فكما ترى
انه رقم ال Handle المرسل اليه هي قيمة Hand المصرح عنه سابقاً (( تم ذكره سابقاً ))
وفي مكان نوع عملية كتبنا WM_CHAR وهي تعني ان العملية عملية ارسال (( كما ذكرت في الخطوات السابقه ))
وفي مكان النص المرسل كتبنا Ord(Text); طبعاً السبب من هذا انه القيمه المطلوب ادخالها في هذا
الحقل قيمة صحيحة Integer ونحن نريد ارسال قيمة نصية string فلو كتبنا strtoitn لتعارضة العملية
بسبب ان النص المكتوب هو عبارة عن حروف وليس ارقام وفي هذه الحالة لجأنا الى استخدام Ord
ووضيفتها هي كذلك تحول النصوص string الى قيم صحيحة integer دون وجود تعارض ولكنها تقوم بتحويل
حرف واحدفقط
وكذلك كما تلاحظ اننا صرحنا عن حلقه متزايده تبداً من 1 وتنتهي بعدد احرف النص الذي نريد ارساله (Text)
وفائدة ذلك هو في هذه العملية وهي عملية التحويل بواسطة ord فهي لاتخرج الا نص واحد تقوم بتحديده
مثال على ذلك اننا نريد ان نحول كلمة Helo الى قيمة صحيحة بواسطة Ord
فلاحظ اننا نكتبها كتالي
ord('Helo'[1]);فعندما تجرب المثال السابق فستلاحظ انه لن يقوم الا بتحويل الحرف الأول وهو H والسبب كما ذكرت سابقاً
انه لايحول الا حرف واحد وتحدد هذا الحرف بعد النص المدخل كما في المثال السابق
ومعنى هذا الكلام ان الفائده من حلقة التزايدية المصرحه لقيمة i هي لكي نخرج النص كاملاً
على العموم
الآن علمية الأرسال جاهزه ولكن ينقصنا شي واحد وهو كيف تعرف رقم ال Handle
التابع للمكان او للبرنامج الذي نريد ان نرسل اليه
هذا ماسنعرفه في الدروس القادمه إن شاء الله
طبعاً لن اترككم لاتتحققون من صحت الكلام السابق
فطبعاً يوجد هناك برنامج يقوم بأعطائك قيمة ال Handle التابعه للمكان المحدد بالماوس
وستجدون هذا البرنامج في هذه الوصلة :
http://www.8op.com/sum/bing.exe
وطريقة العمل هي ان تقوم بفتح البرنامج (( الذي في هذه الوصله طبعاً بعدما تقوم بتحميله من الأنترنت ))
ثم تذهب الى اي مكان يمكن فيه ادخال النصوص (( يعني مكان ضاهر )) وتحدد الفاره عليه
وستلاحظ بهذا البرنامج مكتوب لك Handle : قم بأخذ الرقم الذي مكتوب بعدها
ثم قم بكتابة الكود السابق
procedure Send(const Hand: THandle; const Text: string);
var
i: integer;
begin
if Hand = 0 then
Exit;
if Length(Text) = 0 then
Exit;
for i:= 1 to Length(Text) do
begin
SendMessage(Hand, WM_CHAR, Ord(Text), 0);
end;
end;ثم قم بأستدعائه واكتب رقم ال Handle الذي أخذته قبل قليل من البرنامج السابق
واكتب بعدها النص الذي تريد
مثال : لنفرض ان رقم ال Handle الذي حصلت عليه من البرنامج هو 1020
وتريد ان ترسل لذلك المكان كلمة 'Helo' فسيكون الأستدعاء حسب الآتي
send(1020,'Helo');
ارجوا ان تكون اتضحت لكم الفكرة
وفي الختام ارجوا منكم التشجيع والأستفسار عن اي ملاحظه
وتقبلوا اطيب تحياتي اخوكم SUM
