الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

تعلم كيف تتعامل مع البرامج الخارجيه (( مهم جداً ))

مغلق
بدأه SUM في 1 أكتوبر 2001 · 27 رد · 12,558 مشاهدة · في أرشيف منتدى الدلفي
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

اخوتي الأعزاء اعضاء هذا المنتدى

في البداية احببت ان اوضح لكم سبب طرحي لهذا الموضوع

طبعاً كان السبب هو اني كنت اعلم كم كان شغفكم لمعرفة كيفت التعامل مع البرامج الخارجيه وخاصةالمفتوحة

سواء كان ذلك من حيث الأرسال البيانات لها ام من حيث جلب البيانات منها

والسبب الآخر لطرح هذا الموضوع اني اريد ان ارتقي بمستويات بعضكم الى الأعلى

الأهم من هذا كله ان هذا الموضوع مهم جداً لمعرفة كيفية التعامل مع الويندوز ومعرفة مسيرتها

على العموم

سنبداء الآن الشرح:

طبعاً في تلك العمليات اعني عمليات التعامل مع البرامج الخارجيه يستخدم في الغالب

امر 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

#2

استاذي الفاضل

أشكرك على هذا الدرس الأكثر من رائع والذي سأنتظر تكملة الدروس على أحر من الجمر :) لكن طبعا لا أخلي من الأسئله :D :

1) عملت اللي قلتلي عليه و كل شي صلح معي تمام الا انه لما اعمل كومبايل يقولي فيه خطأ في

SendMessage(Hand, WM_CHAR, Ord(Text), 0);

و بالتحديد في Text رساله الخطأ في Debug هي :

Incompatible types

لكن استبدلت Text بـ'Hello' و لم تصلح, استبدلتها بحرف واحد هو الـ'H' و نفعت :D (استانسسسسست)... لكن... ليه هذا الخطأ؟ هل هو معي انا فقط؟ هل له حل؟ :)

2) انا عندي كود لأخذ عنوان الموقع اللي اليوسر داخله بالاكسبلورر ... يحتوي على هذا الأجرائين :

Function GetText(WindowHandle: hwnd):string;
var
txtLength : integer;
buffer: string;
begin
 TxtLength := SendMessage(WindowHandle, WM_GETTEXTLENGTH, 0, 0);
 txtlength := txtlength + 1;
 setlength (buffer, txtlength);
 sendmessage (WindowHandle,wm_gettext, txtlength, longint(@buffer[1]));
 result := buffer;
end;

function GetURL:string;
var
ie,toolbar,combo,
comboboxex,edit,
worker,toolbarwindow:hwnd;
begin
  ie := FindWindow(pchar('IEFrame'),nil);
  worker := FindWindowEx(ie,0,'WorkerA',nil);
  toolbar := FindWindowEx(worker,0,'rebarwindow32',nil);
  comboboxex := FindWindowEx(toolbar, 0, 'comboboxex32', nil);
  combo := FindWindowEx(comboboxex,0,'ComboBox',nil);
  edit := FindWindowEx(combo,0,'Edit',nil);
  toolbarwindow := FindWindowEx(comboboxex, 0, 'toolbarwindow32', nil);

  result := GetText(edit);
  end;

طبعا أنا مبتدء, طبعا انا ما فهمت شي منهم :P لكننه نقع معي!!

السؤال هو, كيف الكود هذا عرف الـHandle للـUrl في الاكسبلورر و هو يتغير كل مررة؟؟؟؟؟؟ ؟؟؟؟؟ ؟؟؟؟؟ !!

شاكر لك على هذا الموضوع الرااائع

و شاكر لك على الجواب مقدما :)

و شاكر لك على الدروس الباقيه مقدما :D

اخوك DR-A

#3

بسم الله الرحمن الرحيم

اخي العزيز DR-A اشكرك كثيراً على تحمسك

اما بالنسبة للخطأ الذي ذكرت في

SendMessage(Hand, WM_CHAR, Ord(Text), 0);

فالمشكله هي من نفس هذا المنتدى

حيث انه توجد بعد Text اي يعني انها بهذا الشكل ord(Text)

ولكن عندما كتبتها لم يقم المنتدى بأضهارها وقم بتحرير الموضوع لكي اتأكد من وجودها وفعلاً وجدتها ولكنها لم تضهر فحاولت ان اضهرها ولكن دون جدوى

طبعاً اذا لم يضهر ماكتبته بشكل صحيح

فيمكنك الأطلاع على هذا الموضوع في هذه الوصلة:

http://www.kdtools.net/forum/showthread.ph...tid=484#post484

اما بالنسبة لسؤالك الأخر وهو بالنسبة للكود كيف ياخذ ال Handle وهو في كل مره يتغير

طبعاً إن شاء الله ستعرف ذلك وبالتفصيل وستعرف معلومات كثيره في الدورس القادمه

فأرجوا منك الأنتظار

وتقبل اطيب تحياتي اخوك SUM

#4

أشكرك أخي و صلحت معي والحمدلله :D

و بانتظار بقية دروسك :)

#5

السلام عليكم

ماذا اقول ولله يعجز اللسان عن شكرك .اخي العزيز sum بل استاذي العزيز

انت ثالث استاذ اعطاني الكثير بعد استاذي بالجزائر فريد و بالمنتدى arabdevelopers

الاستاذ ابو يوسف .

فتقبل مني فائق الاحترام و التقدير

كما اني خائف ان تفوتني دروسك وانا اتخبط مع dll الطريقة الدينامكية +معرفة ان كان القرص محمي

ضد الكتابة+تحريك ProgressBar وفقا لعملية الفحص .

المهم اشكرك على هذ ا الدرس الدي عجزة عن الاجابة عليه سابقا .

وفقنا الله

كما اطلب من القراء المشاركة ولو بدعاء الي كل الاخوة الدين لايبخلون بعلمهم .

والي الاعضاء المشاركة بالاسئلة لتعم الفائدة .

فتقبلوا مني فائق الاحترام و التقدير.

دائما معكم .

#6

السلام

احييك وبشدة أخي SUM فهذا الموضوع مهم جدا للكثير ولقد كنت أبحث عنه واتمنى منك تكرما أكماله .

#7

بسم الله الرحمن الرحيم

في البداية احيي جميع الأخوة الذين شاركونا بردودهم

وإن شاء الله سأطرح الدرس الآخر عن قريب لأني الآن اقوم بأعداده

فأرجوا منكم الأنتظار

وتقبلوا تحياتي وتقديري اخوكم SUM

#8

نحن في الانتظار على احر من الجمر

لانه موضوع في قمة الروعة والاحتياج

وفقك الله وجازاك كل الخير

#9

السلام عليكم

ألف شكر لك يا أخ سليمان على هذا الموضوع وننتظر منك المزيد :)

(ملاحظة : بالنسبة لمشكلة ظهور المشاركة بهذا الشكل هو استخدامك لحرف i بين قوسين [] فيقوم برنامج المنتدى بحذفها وجعل النص بعدها مائل ، لهذا أقترح أن تضع مسافة داخل القوس أو تستخدم حرف آخر لا يتعارض مع VBCode الخاص بالمنتدى )

#10

بسم الله الرحمن الرحيم

اخوتي الأعزاء في هذه المره سوف نكمل الدرس السابق

وطبعاً سيكون هذا الدرس عن كيفية معرفة ال Handle لبرنامج معين

وسنبدأ الآن في الدرس :

فطبعاً كما ذكرت لكم في الدرس الماضي كيفية استخدام ال SendMessage وفائدتها

والتعامل معها وكما ذكرت لكم اهميه ال Handle فيها

فطبعاً في هذا الدرس سوف تتعلمون كيف تحصلون على ال Handle التابع لبرنامج معين برمجياً

وهذا الدرس سوف يعتمد على ClassName التابعه للبرنامج كما اعتمد الدرس السابق على ال Handle

طبعاً البعض منا لايعرف ال ClassName فلا عليه سوف اتطرق لشرح ال ClassName شرحاً مبسطاً

فكما ذكرت لكم سابقاً ان كل برنامج يعمل على نظام ويندوز يحمل رقم خاص به يسمى ال Handle

واخبرناكم ايضاً بأن هذا ال Handle يتغير في كل مره يتم فيه تشغيل البرنامج

وكذلك ال ClassName فهي مشابهه بعض الشيء لل Handle فطبعاً كل برنامج يحمل ClassName خاص به

وكذلك كل عنصر داخل البرنامج سيحمل ClassName خاص به ايضاً

وطبعاً هذا ال ClassName يمثل ب Name التابع للبرنامج او للعنصر

هناك البعض لم يفهم مااقصد طبعاً سأضرب لكم مثال :

لو قام اي شخص منا بعمل برنامج خاص به بواسطة الدلفي او بواسطة اي لغة اخرى فستلاحظون ان كل كل كائن

وحتى البرنامج الرئيسي او الشاشة الرئيسية (( Form )) تحمل اسماً خاصاُ بها يسمى Name

فطبعاً بعد تنفيذ البرنامج سيتم الأحتافظ بهذا Name تحت اسم ClassName

وطبعاً ميزت هذا ال ClassName انه لا يتغير مثل ال Handle بل انه ثابت على ال ClassName

الخاصه به حتى لو قمت بتشغيل البرنامج اكثر من مره

على العموم سنبدأ الآن في وسط الموضوع كما ارجوا ان تكونوا قد فهمتم ال ClassName

طبعاً في هذا الدرس سنستخدم ClassName بشكل رأيسي لكي نستطيع الوصول الى ال Handle الخاصه به

وسأشرح لكم اسهل طريقه نستطيع الوصول بأستخدام ClassName الى ال Handle

وهي بأستخدام امر FindWindow و FindWindowEx

فسنبدأ الآن بشرح مهمة الأمرين السابقين وكيفية استخدامهم

اولاً FindWindow :

يستخدم FindWindow للوصول الى ال Handle الخاصه بالبرنامج فقط

اليكم هذا المثال على استخدامه

[Code2]

FindWindow('MSBLClass',nil)

[/Code2]

فطبعاً هذا المثال يقوم بالوصول الى ال Handle التابعه لبرنامج MSN Messenger Service
(( برنامج المحادثه ))
وكما تلاحظون في المثال السابق كلمة MSBLClass
فطبعاً هي اسم ال ClassName التابعه لبرنامج MSN Messenger Service
وهكذا يتم التعامل مع FindWindow

ثانياً FindWindowEx :
تستخدم FindWindowEx للوصول الى الكائنات الموجوده داخل البرنامج بحيث تم اولاً الوصول الى ال Handle
الخاصه بالبرنامج ثم تصل الى الكائنات الذي بوسط البرنامج بأستخدام هذا الأمر
انظر الى هذا المثال :

[Code2]

FindWindowEx(ProgramHandle,0,'Edit',nil);

[/Code2]

وكما تلاحظون في المثال السابق طريقة عمل FindWindowEX فطبعاً ProgramHandle تعني رقم ال Handle التابع
للبرنامج او للعنصر الذي بداخله الكائن و Edit تعني اسم ال ClassName التابع للكائن
وطبعاً اذا كان الكائن داخل كائنات اخرى فأنه لايتم الوصول اليه بشكل مباشر فيجب عليك اولاً الوصول
الى الكائنات التي فيها الكائن ثم الوصول الى الكائن نفسه
فمثلاً لو افترضنا انه يوجد لدينا برنامج ويوجد بهذا البرنامج عنصر Panel وفي داخل
هذا ال Panel كائن Edit ونريد الوصول الى Edit فيتم اولاً الوصول الى ال Handle التابعه للبرنامج ثم
نحصل على ال Handle التابعه لل Panel ثم نحصل على ال Handle التابعه لل Edit

مثال :

[Code2]

Var
Form,Panel,Edit:THandle;
begin
Form:=FindWindow('TForm1',nil);
Panel:=FindWindowEx(Form,0,'Panel',nil);
Edit:=FindWindowEx(Panel,0,'Edit',nil);

[/Code2]

وهكذا تيم معرفة ال Handle بأستخدام ال ClassName .


اما الآن سنطرح كود ثم سنقوم بشرحه

[Code2]

function URL:string;
var
ie,toolbar,combo,combobox
,edit,worker:THandle;
Tex:string;
begin
ie := FindWindow('IEFrame',nil);
worker := FindWindowEx(ie,0,'WorkerA',nil);
toolbar := FindWindowEx(worker,0,'rebarwindow32',nil);
Combobox := FindWindowEx(toolbar, 0, 'comboboxex32', nil);
Combo := FindWindowEx(combobox,0,'ComboBox',nil);
Edit := FindWindowEx(combo,0,'Edit',nil);
SetLength(Tex,Max_Path);
SendMessage(Edit,WM_GETTEXT,Max_Path,LongInt(@Tex[1]));
Result:=Tex;
end;

[/Code2]

هذا الكود يقوم بجلب العنوان المفتوح في متصفح انترنت اكسبلورير
والفائده من هذا المثال لكي تتضح لكم الفكره اكثر ولكي تعرفوا كيفية الوصول بالتسلسل الى الكائنات
فطبعاً كما تلاحظ في هذا المثال بأننا صرحنا عن عده متغيرات من ال Handle وعن متغير string وسميناه Tex
فطبعاً الفائده من متغيرات ال Handle اننا نقوم بتحميل ارقام ال Handle التي نحصل عليها بوسطها لكي
نستطيع الوصول اليها في العمليه التاليه والفائده من متغير string الذي سميناه tex لكي نقوم بتحميل
العنوان الذي سنصل اليه في هذا المتغير
وبعدها ننظر الى العملية التاليه فكما تلاحظ اننا قمنا اولاً بالوصول الى البرنامج بأستخدام امر
FindWindow وطبعاً اسم ال Classname الذي سنصل اليه هو IEFrame وقمنا بتحميل رقم ال Handle الناتج
في وسط متغير ال Handle الذي سمينها ie وطبعاً ال ClassName السابق (( IEFrame )) هو اسم ال ClassName
لبرنامج انترنت اكسبلورير
انظر الى الكود

ie := FindWindow('IEFrame',nil);

وفي العمليه التاليه قمنا بالوصول الى بأحد الكائنات التي في داخل البرنامج وطبعاً اسم ال ClassName

التابع لهذا الكائن WorkerA وقمنا بتحميل قيمة هذا العنصر داخل المتغير Worker

انظر الى الكود

[Code2]

worker := FindWindowEx(ie,0,'WorkerA',nil);

طبعاً لاحظ كلمة ie فطبعاً هي تعني متغير ال Handle الذي صرحنا به سابقاً وطبعاً هو يحمل قيمة ال Handle

التابعه للبرنامج كما هو موضح في العمليات السابقه وطبعاً معنى ذلك هو انه في هذه الخطوه نريد ان نحصل

على ال Handle التابعه لعنصر WorkerA الموجود داخل البرنامج

وفي الخطوه التاليه قمنا بالوصول الى عنصر موجود داخل الكائن السابق WorkerA واسم ال ClassName

لهذا العنصر الذي نريد الوصول اليه هو rebarwindow32

انظر الى الكود

[Code2]

toolbar := FindWindowEx(worker,0,'rebarwindow32',nil);

[/Code2]

فلاحظ في هذا المثال كلمة Worker وهي تعني المتغير الذي صحرنا عنه في المتغيرات ويحمل قيمة Handle
وقمنا بأدخال قيمه WorkerA بداخله ومعنى ذلك اننا نريد ان نحصل على قيمة العنصر rebarwindow32
الموجود داخل العنصر WorkerA ونقوم بتحميلها داخل المتغير toolbar


وبقية الأوامر التاليه على نفس النمط السابق حتى نصل الى قيمة العنصر Edit وهو الشي المهم لدينا
لأنه هو مكان تواجد العنوان التابع للمتصفح وبعدما نصل الى الى قيمة Edit ينفتح لنا المجال لوضع
العمليات عليها وذلك بأستخدام امر SendMessage

والآن نريد ان نتطرق لشرح باقي العمليات بعد عملية الوصول الى ال ClassName المسماه Edit

فلاحظ بعد تلك العمليات الأمر التالي

[Code2]

SetLength(Tex,Max_Path);

ومهمة هذا الأمر انه يحدد طول المتغير Tex الذي يحمل قيمه string والذي سنستفيد منه في تحميل

النص الذي سنجلبه من متصفح الأنترنت اكسبلورير

والفائده من هذه العمليه هي اننا نحتاج في عملية استجلاب النصوص تحديد طول النص الذي سيجلب له

(( طبعاً هذا بعكس الدرس السابق فكنا نرسل نصوص اما في هذا الدرس فقد استجلبنا نصوص ))

وهناك ملاحظه بسيطه احببت ان نسفيدوا منها وهي حينما تلاحظون كلمة Max_Path فطبعاً البعض منا لايعرف

هي لماذا فطبعاً فائدتها انها هي اكبر قيمه ممكنه فمثلاً انت لاتدري كم سعة شي معين ويجب عليك في

احد الأوامر تحديد السعه فقم بكتابة Max_Path وهي كما ذكرت قيمه طلقه وطبعاً انا استعملتها في هذا

الأمر لنه في عملية SetLength يجب عليك ان تحدد النص الذي تريد ان تحدد سعته ثم تحدد السعه فطبعاً

لو وضعت مثلاً السعة 3 او اي رقم آخر وانا لا اعرف سعة النص الذي سيدخل في هذا المتغير لم يعمل الأمر

بنجاح

وفي العملية التاليه قمنا بعملية استجلاب النص بواسطة امر SendMessage

انظر الى الكود

[Code2]

SendMessage(Edit,WM_GETTEXT,Max_Path,LongInt(@Tex[1]));

لاحظ الكود السابق

فكما تلاحظ اننا نقوم بعملة استقطاب النصوص من من المتغير Edit الذي يحمل قيمة Handle الذي ادخلنا

بداخله قيمة ال Handle للعنصر Edit (( الذي يوجد به العنوان )) داخل برنامج انترنت اكسبلورير

وبعدها حددنا نوع العملية وكما تلاحظ اننا كتبنا WM_GETTEXT ومعنى ذلك ان العملية عملية جلب

(( كما شرحنا ذلك في الدرس السابق ))

وبعدها ستجد كلمة Max_Path وذكرت لكم سابقاً وضيفتها وطبعاً مكانها في هذا الحقل يحدد طول

النص الذي ستجلبه وطبعاً لو كان المقاس اصغر من النص الذي ستجلبه لن تعلم العملية بنجاح

ولذلك كتبنا Max_Path لأننا لانعلم طول النص

وبعدها ستجد اننا حولنا قيمة Integer الى قيمة string بواسطة Longint وبعدها رفعنا العملية بواسطة

@ الى متغير Tex الذي يحمل قيمة string والسبب لأننا نريد ان ندخل النص الذي سنجلبه بوسط هذا المتغير

والآن سأفتح لكم المجال للتجربه و الأستفسار

وقبل ذلك احببت ان اقول لكم ملاحظه وهي

انه البعض منا لايعرف كيف يحصل على ClassName للبرامج والعناصر فطبعاً يمكنكم ذلك بواسطة البرنامج

الذي ذكرته لكم في الدرس السابق

والذي هو موجود على هذه الوصلة :

http://www.8op.com/sum/bing.exe

وطبعاً إن شاء الله في الدروس القادمه سنتعلم معلومات جديده ومثيره

فأنتظروها

وتقبلوا اطيب تحياتي اخوكم SUM

#11

بسم الله الرحمن الرحيم

اخوتي الأعزاء

اعتذر على نسياني نقطه مهمة لم اتطرق لشرحها

وهي كيفية معرفة الكائنات التي يدخل بها الكائن الذي تريد

مثال ذلك هو هذا الكود

function URL:string;
var
ie,toolbar,combo,combobox
,edit,worker:THandle;
Tex:string;
begin
ie := FindWindow('IEFrame',nil);
worker := FindWindowEx(ie,0,'WorkerA',nil);
toolbar := FindWindowEx(worker,0,'rebarwindow32',nil);
Combobox := FindWindowEx(toolbar, 0, 'comboboxex32', nil);
Combo := FindWindowEx(combobox,0,'ComboBox',nil);
Edit := FindWindowEx(combo,0,'Edit',nil);
SetLength(Tex,Max_Path);
SendMessage(Edit,WM_GETTEXT,Max_Path,LongInt(@Tex[1]));
Result:=Tex;
end;

فطبعاً كم كان البعض يدور في رأسه كيف عرفة الكائنات التي دخل فيه العنصر Edit في المتصفح انترنت اكسلبورير

طبعاً لاعليه فذلك سهل جداً فيوجد عدة طرق واسهل طريقه هو هذا البرنامج الرائع

الذي ستجدونه في هذه الوصلة :

http://www.8op.com/sum/classname.zip

بعدما تقوموا بتحميله وتقومون بتشغيله

ستجدون البرنامج مكون من 7 صفحات وهي

1- Window (( هذه الصفحة يوجد بها معلومات عن الكائن المحدد على الماوس فمثلاً يوجد بها رقم ال Handle وغيره ))

2- Class (( هذه الصفحة يوجد بها اسم ال ClassName للكائن المحدد ))

3- Parents (( هذه هي الصفحة المهمة في موضوعنا فيوجد بها اسماء ال ClassName التي يدخل فيها الكائن ))

4- Children (( هذه الصفحة تظهر لك جميع الكائنات التي في البرنامج المحدد بالماوس ))

5- Graphics (( هذه الصفحة يوجد بها صورة للكائن او المكان المحدد

6- Options (( هذه الصفحة يوجد بها خيارات للبرنامج ))

7- About (( هذه الصفحة يوجد بها معلومات حول البرنامج ))

اليكم صورة من البرنامج

Unit1.JPG

فطبعاً عندما تريد ان تعرف الكائنات التي يدخل فيها الكائن المحدد بالماوس

اذهب الى صفحة Parents وحدد الكائن الذي تريد ان تعرف اسماء الكائنات التي يدخل فيها

طبعاً اليكم هذه الصورة التي توضح لكم ذلك (( طبعاً انا في هذه الصورة محدد على الكائن Edit في المتصفح

انترنت اكسبلورير لكي ترى كيف وصلنا الى الكائنات السابقه (( التي في الكود )) ))

Unit2.JPG

لاحظ القائمه السابقه ولاحظ الكائنات التي قمنا بالوصول اليها بالتدريج في الكود السابق فسترى انها هي نفسها

(( طبعاً الكائنات تبدأ من اسفل والعنصر المحدد لايضهر بالقائمه وعندما تريد معرفته يمكنك الذهاب الى صفحة Class))

و الآن سنفتح لكم المجال للتجربه

وتقبلوا اطيب تحياتي اخوكم SUM

#12

ماشاءالله :)

درس طويل و مفيد جدااااا

تسلملي هالأيادي يا رب :)

أشكرك أخي, و الله يزيد علماً فوق علمك :)

سؤال صغنون : لو احد يبي يرسل كلام ليس الى Handle بل الى البرنامج كلله.. بغض النظر لو كان في بالبرنامج Edit Box أو لأ (ابي استخدمها بالاحتصارات) هل هي بنفس الطريقة ولا فيه فرق؟

مررة أخرى أشكرك على الدرس الرائع :)

#13

بسم الله الرحمن الرحيم

اخي العزيز DR-A

اشكرك على اسئلتك الرائعه التي تدل على حبك للتعلم والأطلاع

على العموم اذا كنت تقصد الوصول الى ال Handle التابع للبرنامج

فطبعاً يتم ذلك بنفس الطريقه

وتقبل اطيب تحياتي اخوك SUM

#14

:)

ليس الـHandle

انا اريد ان ارسل اختصار الى البرنامج

يعني البرنامج فيه زررين Yes و No ... المبرمج جاعل البرنامج انه اذا ظغط المستخدم على الحرف y معناها Yes و اذا ظغط على n معناها No

:)

فهمت قصدي؟؟ هنا ايش يكون الهاندل؟ او يكون له طريقة نفسها؟

أسف اذا تعبتك لكن أتمنى لو تعلمني كيف اعملها :)

#15

السلام عليكم

استاذي sum اشكرك على الدرس القيم لكن لو شرحت لنا الكود سورس للبرنامج الذي بفضله نتحصل على classename لانها هي المشكلة في نضري لانني كنت اسخرجclassename يدويا بws32.exe الدي نجده مع الدلفي .

#16

بسم الله الرحمن الرحيم

في البداية اشكر كل من الأخوة DR-A و Pati على هالأسئلة

فطبعاً يااخي DR-A طريقة التغيير في البرمجة هذا غير ممكن

لأنه كما تعرف تتحول البرمجة بعد تطبيق البرنامج الى لغة الآلة

وطبعاً كلامك في تغيير الأخصتار كذلك يدخل في البرمجة لأن المبرمج

ببرمجته يحدد الأختصارات وكما ذكرت لك انه من غير الممكن التغيير في البرمجة

اما بالنسبة لك ياأخ Pati فقولك بأن المشكله عندك تحصل دائماً مع ال ClassName

فليس هناك مشكله مع هذا البرنامج :

http://www.8op.com/sum/classname.zip

:)

واذا كنت تريد ام تحصل على ClassName بواسطة البرمجه فهذا غير ممكن لأنه ليس هناك شي ثابت يدل على ال ClassName

وطبعاً في البرامج السابقه التي تعطيك ال ClassName يوجد هناك شي تدلل فيه وهو مؤشر الماوس

وطبعاً اذا كنت تريد ان تعرف كيف تحصل على ال ClassName للمكائن المؤشر عليه بالماوس فإن شاء الله سوف اقوم بتنزيل الكود سورس للبرنامج السابق لكي تتطلعوا عليه

وتقبلوا اطيب تحياتي اخوك SUM

#17

مشكور استادي على هدا الرد واتمنى ان تقدم لنا السورس

والله يجازيك ويعطيك العافية .

وانا في الانتضار بكل الشوق .

لكن استادي :

اعلم او كما قلت انت ان classename

انها لاتتغير كالهندل فكيف لانستطيع الوصل الى طريقة برمجية تحددها لنا0

او نبني dll مثلا.مكتبة يحتوي على كل classename المشهورة لبارامج ميكرو سفت . هل نستطيع ؟

تحياتي .

#18

السلام عليكم

بالنسبة للسؤال حول معرفة ClassName لعنصر تحكم آخر فهذا ممكن ، ولكن يجب معرفة Handle أولاً :)

يتم ذلك باستخدام الدالة GetClassName . أما بالنسبة لمعرفة الهاندل فتوجد دوال أخرى منها GetNextWindow والتي تفيد في معرفة البرنامج الذي يلي(تحت) الهاندل الذي مررته للدالة

     h2 := GetNextWindow(h1, GW_HwndNext);

اذا رغبت في معرفة الهاندل الذي قبل(فوق) فيكون المعامل الثاني GW_HWndPrev

أما الدالة التي تمكنك من الحصول على الهاندل بواسطة نقطة معينة على الشاشة فهي WindowFromPoint

مثال : قم بوضع Memo و ActionList وأضف حدثاً إليه ثم اجعل له اختصاراً من لوحة المفاتيح ( Ctrl+H مثلاً) ثم أضف هذا الكود :

procedure TForm1.Action1Execute(Sender: TObject);
var h1 : THandle;
    p1 : TPoint;
    CName : string;
begin
     GetCursorPos(p1);		// الحصول على الموقع الحالي لمؤشر الماوس
     h1 := WindowFromPoint(p1);	  //  الحصول على الهاندل
     SetLength(CName, 30);
     GetClassName(h1, PChar(CName), 30);   // ClassName  الحصول على الـ	
     Memo1.Lines.Add('Handle = '+IntToStr(h1)+' ,  ClassName = '+CName);
end;

الآن شغل البرنامج وحرك الماوس في أي مكان من الشاشة واضغط Ctrl+H لتحصل على الهاندل واسم الكلاس

أيضاً هناك دالة أخرى لارسال الرسائل الى البرامج غير SendMessage اسمها PostMessage ، والفرق بينهما أن الدالة الأولى تنتظر تنفيذ الاجراء الخاص بالرسالة ولا تعود حتى يتم تنفيذه ، أما الدالة الثانية فتقوم بوضع الرسالة في رتل الرسائل وتعود فوراً .

#19

اشكركم جميعا على الاهتمام

ساجرب مقدمته لي اخي fsl

وشكرا مرة اخرc

#20

الاخ DR-A

اهذا هو ما تبحث عنه؟

http://www.swissdelphicenter.ch/en/showcode.php?id=727

هناك حتى الأحلام أصبحت ممنوعة ...

إنه لعار أن ننتمي لهكذا أوطان ... لكن ... ربما العار أن نكون نحن أبناء لتلكم أوطان .. من يدري ؟!!

ليعلم أولئك ... إنّ الشعوب إنْ هي استيقظت تسحق ظُلامََهَا ...

There, even in dreams u r wanted

To be a programmer, how a nice dream it was

Leaving ...

أعيدوا لإسمي لونه المفضل

#21

أشكر الإخوة على هذا البحث المتميز الذي قدموه

أخوكم

أبو ماجد الصارم

#22

انتظروا تكلمت الدروس عن قريب

وتقبلوا اطيب تحياتي اخوكم SUM

#23

بسم الله الرحمن الرحيم

اخوتي الأعزاء

في البداية اعتذر عن عدم تكملتي للموضوع فقد وعدتكم من قبل ان اقوم بتكملت الموضوع ولكن لم تسمح لي الفرصة بذلك

على العموم لقد وجدت لكم كتاب رائع وبل اكثر من رائع يتكلم عن هذا المجال او الموضوع بشكل مفصل

طبعاً هو جزء من كتاب وليس كتاب كامل فهو عبارة عن وحدة ال Adventures in Messaging من كتاب Delphi 6 Developer's Guide

يمكنكم تحميل هذا الكتاب من هذه الوصلة :

http://www.pearsonptg.com/samplechapter/0672321157.pdf

اليكم الصورة الأمامية من الكتاب

0672321157b.gif

ارجوا ان تجدوا فيه ماتريدون

وتقبلوا اطيب تحياتي اخوكم SUM

#24

بسم الله الرحمن الرحيم

اشكرك اخ واستني sum على هدا الكتاب الرائع وبل اكثر

تحياتي

اخي هل استعملت تصميم الصفحات بالدلفي

#25

اهلاً بك اخي العزيز pati

في الحقيقة يااخ pati ان لم استخدم الدلفي بعد في برمجة الأنترنت ولكني قد قرأت مقالات عنها ويمكن الاستفادة من هذه المقالات

اليك هذا المقال من شركة بورلاند مشروحة هذه التنقية بالصور

http://community.borland.com/article/0,141...0,27404,00.html

ارجوا ان تكون هو ماتبحث عنه

وتقبل اطيب تحياتي اخوك SUM

هذا الموضوع مغلق.

مواضيع مشابهة