تعلم معي كيف تتعامل مع البرامج الخارجيّة
#1
بسم الله الرحمان الرحيم...
اخواني الكرام سلام الله عليكم اجمعين...

اليوم معنا درس عن كيفيّة التعامل مع البرامج الخارجيّة...

وهذا موضوع سيتم تطويره ان شاء الله شئ فشيئا بئذن الله....

يعني على نهج الأخ العزيز الحبيب nabilkeb بارك الله له وجزاه الله كل خير...\
يعني سامحني اخي نبيل على اخذ طريقتك في القآء الدروس :p لكن منك نستفيد اخي الحبيب

نعم....
الدرس اقوم به لأستفيد انا بإذن الله ويستفيد الإخوة معي...
وأود ان ابحر في هذا المجال بإذن الله ولذلك قد يكون هذا الموضع كبداية جيّدة بإذن الله...
ويجب ان انبّه الإخوة ان هذا الموضوع سيكون فقت اساسيّات في هذا المجال وانا لست خبيرا في هذا المجال...
لذلك من لديه اي شئ ممكن ان يفيدنا ويفيد الإخوة من حولي فبارك الله فيك وجزاه الله كل خير على نشر العلم وتعليمه...

وقبل ان ابدئ بلدرس يجب ان ادل على صاحب الموضوع الأصلي وهو الأخ الفاضل SUM من منتدى الفريق العربي للبرمجة

طيب ماذا نستفيد من هذا الموضوع ان كان الأخ قد شرحه مسبقا ؟
نعم اولا...

الموضوع شوي قديم... ولكن هو الوحيد على الساحة العربية( الذي رأيته انا ) الذي يتكلم عن هذا الموضوع والله المستعان...
ولهذا قد يكون مفيدا لو تم اعادة صياغة الموضوع... بلإضافة الى انني سأحاول ان اشرح الموضوع بطريقة اسهل بإذن الله...

ومن لديه اي سؤال فلا يتردد في سؤآله...
ان كنت اعلم الإجابة اجيب... وان لم اكن اعلم فنبحث سويا بإذن الله...

تابعوا معي

اولا حمّل البرنمجين
من المرفقات...

الأول اسمه Win X_1.3 وهو يعمل بدون تثبيت... (وأظن انه مبرمج بلدلفي ان لم اكن مخطئ والله اعلم)
والثاني وهو برنامج اسمه WinDowse ويحتاج الى تنصيب ... حمله ونصبه... بارك الله لك
لأني الدرس سيعتمد على هاذين البرنامجين....

.../...يتبع..../....


الملفات المرفقة
.rar   Win X_1.3.rar (الحجم : 260.68 ك ب / التحميلات : 1,027)
.rar   wdsetup_WinDowse.rar (الحجم : 524.87 ك ب / التحميلات : 995)
الرد
#2
نبدئ بإذن الله....

اولا... سنقوم بعمل برنامج يأخذ الكتابة من المفكرة... يعني ال
Notepad
وبنفس الوقت سنرسل من خلال البرنامج الذي نصممه نصوص الى الفكرة...

مستعدّون ؟

نعم...
اولا اعطيكم فكرة عن سير الموضوع والبرنامج...

سنتعام مع الهاندل لبرنامج المفكرة...
Handel
نأخذ الهاندل للمفكرة... ونرسل عن طريقه نص او نصوص الى المفكرة...
وكذلك العكس... نأخذ الهاندل ونجلب النصوص من المفكرة
والعملية سهلة جدا ويسيرة بإذن الله...

سنتعرف ونتعامل مع الامر
SendMessage
ولهذا السبب نحتاج الى معرفة الهاندل لأن هذا الأمر يعتمد اعتمادا كليّا على الهاندل...

طيب ما هو الهاندل ؟
نعم هو ممكن ببساطة ان اقول لكم انه رقم يتعرف الوندوز على البرنامج من خلاله... (هل الهاندل خاص فقد للوندوز ؟ ام لكل انظمة التشغيل؟)
وفي البرنامج هناك عدة مكونات ... وكل هذه المكونات لديها هاندل خاص بها...
يعني حتى نستطيع ان نصل الى المكون المطلوب... يجب معرفة الهاندل...

لكن المحيّر مع هذا الهاندل هو انه يتغير في كل مرة نقوم بفتح البرنامج...
وهنا كانت مشكلتي الكبرى... وهي..
ان كان الرقم يتغير في كل مرة... فكيف نقوم ببرمجة برنامج يتعامل معه؟
هل يجب ان نصمم برنامج يستخدم مرة واحدة فقت؟ وبعدها نبرمج برنامج آخر؟
ليس معقولا ان يكون الأمر بهذا الشكل
ووقفت عند هذه النقطة حائرا لا ادري كيف السبيل الى الحل...
لكن بفضل الله تمكنت من تجاوز هذا السؤال سريعا بعد قرائة موضوع الأخ SUM عدة مرات...

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

سأرتاح قليلا وأكمل بعدها ان شاء الله..

.../...يتبع..../....
الرد
#3
بسم الله الرحمان الرحيم...
نعم اخواني لنكمل ان شاء الله...

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

نفتح المفكرة اولا لنستطلعها...
ماذا موجود بها؟
نعم موجود قائمة في الأعلى...
وموجود مساحة حتى نكتب بها اي انها
Memo
او ما شابه ذلك...
المهم عندنا الآن هو الميمو لأنه هو المكون الذي سنتعامل معه..
لكن يجب انبه الآن الإخوة الكرام على شئ مهم...
وهو ان هذا الميمو موجود داخل البرنامج المفكرة اليس كذلك؟
يعني انه لديه رقم هاندل خاص به, اليس كذلك؟
جميل..
لكن حتى نستطيع الوصول الى هاندل الميمو يجب اولا الوصول الى هاندل الأب...
Parent
وو الى آخره...
يعني انتم تعرفون كيف تتعاملون مع ال الأب و الأبناء في دلفي
Parent and Childrens
و التنبيه هو اخواني الكرام...
ان اردتم ان تصلوا الى مكون في اي برنامج يجب ان تعرفوا الآب...
وبعدها الإبن وبعدها ابن الإبن وو الى آخره حتى تصلوا الى المكون المراد التعامل معه...

واضح؟
ان كان واضحا فلحمد لله...
وان لم يكن... فلا تترددوا في السؤال بارك الله لكم...
...

نعم...
الآن امامنا المفكرة...
نفتح البرنامج الذي اسمه
Win X_1.3

ونجد في احدى الزواية مربع كما في الصورة...
(البرنامج والله اعلم بلفرنسيّة لم اجد نسخة بلإنجليزية.. سامحونى)

[صورة: 36355795aaa8246bc62fb969a0b6669f96e2f4d.png]



نضغط على ذلك المربع...
ونسحبه الى زاوية المفكرة...

حتى يصبح بلشكل الذي في الصورة...
[صورة: 3635577be7d2d8e17b176d9b6f9f0bb18cdfde6.png]


الآن هذا اهو الأب الكبير للبرنامج...
تلاحظون العلامة الزرقاء حول البرنامج؟

نعم...
الآن افلت المربع وسيأتي معلومات عن البرناج المفكرة داخل البرنامج
Win X_1.3
تلاحظونها؟

نعم...
جرب الآن نفس الشئ ولكن اسحب حتى تصل الى الميموا
ويصبح الون بلأحمر... كما في الصورة اسفل...
[صورة: 3635578b8549c99fe305e4c4a965c64e2b9517f.png]


هذا هو ابن الأب الكبير
ههههههه
......
رقم الهاندل تجدوه في البرنامج بجانب اسم
Handle
وفي حالتي انا الآن فهو... 132884
ولكن المهم بنسبة لنا هو ما مكتوب بجانب ال
Classe:

طيب اخواني الكرام...
انا الآن اكتب من المدرسة وأثناء الدرس ايضى... هههههههه
اكمل لاحقا ان شاء الله...
ان كان هناك اي سؤال او تريدون اي توضيح فهذا ممنوع :eek: ههههه
امزح...
والسلام عليكم ورحمة الله

.../...يتبع..../....
الرد
#4
بسم الله الرحمان الرحيم
نكمل بعض الشئ بإذن الله تعلى...

نصمم شكل البرنامج اولا... سيكون بشكل التالي…
نضع المكونات التالية
كود :
Button1 Button2 Edit1 Label1
ونغيّر العنواين الى شئ مناسب

الصورة توضح...
[صورة: 84097619.png]


الأن اخواني حان وقت العمل مع الكود
نبدئ على بركة الله...

اولا يجب ان نعرّف بعض المتغيّرات التي هي ستكون المسؤلة عن الهاندل للمفكرة...
لكن كم واحدة هي؟
نعم,, اولا نحتاج الى متغيّر يأتي بهندل تبع الأب الكبير لبرنامج المفكرة...
وبعدها نحتاج الى متغير يقوم بجلب الهاندل للميمو التي هي الإبن للأب الكبير...
هل نحتاج شئ آخر؟
لا... ليس الآن... ولكن لو افترضنا انه لدينا 5 من الأبناء...
اذا سنحتاج 1 متغيّر للأب و 5 للأبناء... واضح؟

طيب...
اذا نعرف2 من المتغيرات .,, انا استخدمت هذين ...
والمتغيّرات بلتأكيد سيكونون من النوع تي هاندل...
مثال...
var
كود :
forr, edi : THandle;

هذا اولا...
ثانيا...
نحتاج الى متغير يكون المسؤل عن النص الذي سيتم جلبه او ارساله...
وهو يكون من النوع سترينج طبعا...
هكذا
كود :
Tex: string;

والنتيجة هي التالي لحد الآن...
كود :
procedure TForm1.Button1Click(Sender: TObject); var forr, edi : THandle; Tex: string;

نعم.. بين ال
كود :
Begin
و
كود :
End
نكتب التالي ولكن قبل ان تكتب دعني اشرح بعض الشئ...
نستخدم كلمة او الأمر
كود :
FindWindow
لنحدد الأب الكبير للبرنامج... وبعدها نضع النتيجة في المتغير الأول
كود :
forr
نعم كما ذكرت سابقا... نستخدم البرنامج الذي تم ذكره في الأعلى...
ونضغط على المربع ونسحبه على المفكرة والنتيجة في ال
كود :
Classe
ستكون التالي...
كود :
Notepad

هذه مهمة الآن... نكتب التالي في الدلفي...
كود :
forr := FindWindow('Notepad',nil);
وهذا هو اول سطر بعد ال
كود :
Begin
ماذا يعني هذا الكود؟...
نعم ال
كود :
FindWindow
هو فونكشن يأتي بلهاندل...
ولكن هاندل لماذا؟
نعم هاندل للأب الكبير الذي اسمه
كود :
Notepad
وبعد ان يأتي بهذا الهاندل يضعه في المتغير...
بعدها يجب ان نستخدم الأمر...
كود :
FindWindowEx
ولذي يقوم بجلب الهاندل ولكن للأبناء...
يعني هو خصصيصا للأبناء..
تكتب التالي...
كود :
edi := FindWindowEx(forr,0,'Edit',nil);
وهنا كما ترون.. نحدد الأب الكبير اولا... ثم نحدد بعدها الأبن
والذي هو يعنوان
كود :
Edit
يعني الميمو في المفكرة.. الكلاس لها اسمه ايديت...
واضح لحد الآن؟ نعم... وكما تم شرح في السابق .. يجلب الهاندل ويضع في المتغير الثاني والذي هو
كود :
Edi
بعدها نضع السطر التالي..
كود :
SetLength(Tex,Max_Path);
ونلاحظ اخواني الكرام ان التيكس... هو نفسه المتغير الذي عرفناه... وهو من نوع سترينج...
بعدها نضع التالي...
كود :
SendMessage(edi,WM_GETTEXT,Max_Path,LongInt(@Tex[1]));
وهنا نرسل أمر بلسيند ماسج... ونقول له... في الهاند لل
كود :
Edi
نجلب الكتابة منه... يعني نجلب التيكست من هذا المكون الذي لديه الهاندل مخزّن في المتغير
كود :
Edi
وبعدها... يعني بعد ما نجلب الكتابة نضعه في المتغير النصّي الذي عرّفناه بلأسم
كود :
Tex
واضح ؟
نعم هذا ما اعرفه لحد الآن والله المستعان
ان كان احد الخبراء يعلم المزيد عن هذا السطر فلا بيخل علينا بارك الله فيه...
نعم وفي الآخير... نضع السطر التالي...
كود :
edit1.Text:=Tex;
وهو معروف لماذا...
يعني نحدد اليديت بوكس تيكست ليظهر التيكست المجلوب...

يعني في الآخر...
يكون شكل الكود بلكامل على هذا الحال..

كود :
procedure TForm1.Button1Click(Sender: TObject); var forr, edi : THandle; Tex: string; begin forr := FindWindow('Notepad',nil); edi := FindWindowEx(forr,0,'Edit',nil); SetLength(Tex,Max_Path); SendMessage(edi,WM_GETTEXT,Max_Path,LongInt(@Tex[1])); edit1.Text:=Tex; end;

هذا كل شئ لحد الآن...
بارك الله لكم
آخيرا اود ان اقول لكم ان اردتم ان ترسلو كتابة الى المفكرة...
بإمكاننا ان نستخدم نفس الكود ولكن نغير حرف واحد...
وهو الحرف ؟؟؟؟؟؟؟؟؟؟

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

نعم هو حرف واحد

بارك الله لكم وجزاكم خيرا...
وان شاء الله سأعطيكم مهمة تنجزونها حتى اتأكت انكم استفدتم من الدرس... Cool

بارك الله لكم وجزاكم خيرا
ولا نسوني من صالح دعائكم...
والسلام عليكم ورحمة الله وبكاته

.../...انتها الدرس... ولكن بقي ان تجيبوا على السؤآل + مهمة تأتيكم لاحقا ..../....
الرد
#5
نعم اخواني الكرام...
الحرف هو؟
نعم مازلت انتظر الجواب...
هو سهل ويسير... يعني مع شوية تركيز فقد... :eek:
امهلكم لحد الأحد المقدم... وبعدها ان لم يضع احد الجواب اضعه انا ان شاء الله حتى يستفيد الإخوة جميعا بإذن الله...

ونسيت ان اذكركم بعنوان مهم وهو من الأخ الحبيب العزيز kachwahed
الرابط يتحدث عن نفس الشئ تقريبا ولكن مع قليل من التفصيل وهو مفيد جدا... بارك الله فيك اخي kachwahed على الرابط Rolleyes

نجدون الرابط هنا... وهو بلإنجليزية والله المستعان

بارك الله لكم والسلام عليكم ورحمة الله
الرد
#6
السلام عليكم
ان شاء الله يكون الحلWink
كود :
procedure TForm1.Button2Click(Sender: TObject); var forr, edi : THandle; Tex: string; i:integer; begin forr := FindWindow('Notepad',nil); edi := FindWindowEx(forr,0,'Edit',nil); if Edit1.Text='' then ShowMessage('please enter the message u want to send') else text:=Edit1.Text; for i:= 1 to Length(Text) do begin SendMessage(edi, WM_CHAR,ord(text[i]), 0); end; end;
لا اله الا الله
عدد ما كان وعدد ما يكون وعدد الحركات والسكون
الرد
#7
نعم اخي galag8 حيّاك الله...
اجابة مقبولة ما شاء الله عليك مع انه تم تغيّر الكثير من الكود :eek:..
على كل حال تم ارسال النص الى المفكرة وهذا هو المهم...
شكرا على مشاركتك اخي الحبيب Smile

ننتظر مشاركات الإخوة والجواب على السؤآل... Smile
والسلام عليكم
فرّج همّ المهمومين يا الله
اللهم فك قيد اسرانا و اسرى المسلمين
الرد
#8
moh__ كتب :آخيرا اود ان اقول لكم ان اردتم ان ترسلو كتابة الى المفكرة...
بإمكاننا ان نستخدم نفس الكود ولكن نغير حرف واحد...
وهو الحرف ؟؟؟؟؟؟؟؟؟؟

..../....

السلام عليكم انا مبتدئ (تحضيرى) وهذا المنتدى هو مدرستىواحاول يوميا معكم حسب ما توصلت اليه الحرف استبدال sمكان g فى كلمتى get and set الا اننى لم افهم كثيرا حيث فهمت انه يستعمل للكتابة فى المفكرة (notpade) وعندما طبقته وجدته يغيير عنوان الفورم حسب edit ويجلب عنوان الفورم الى edit ****ا ان تبشط مع توضيح فيما يمكن ان نستعمله وشكرا لك ولكل الاساتذة الكرام
كود :
procedure TForm1.Button5Click(Sender: TObject); var forr, edi : THandle; Tex: string; begin forr := FindWindow('Notepad',nil); edi := FindWindowEx(forr,0,'Edit',nil); SetLength(Tex,Max_Path); SendMessage(edi,WM_SETTEXT,Max_Path,LongInt(@Tex[1]));// edit3.Text:=Tex;
الرد
#9
حيّاكم الله جميعا اخواني...

إقتباس :حسب ما توصلت اليه الحرف استبدال sمكان g فى كلمتى get and set

نعم هذا صحيح اخي الحبيب..
بارك الله لك Smile وما شاء الله عليك
إقتباس :الا اننى لم افهم كثيرا حيث فهمت انه يستعمل للكتابة فى المفكرة

نعم اخي الكريم...
هذا هو الدرس..

لتطبيقق لدرس ستتمكن من ارسال + جلب معلومات نصّيا من المفكرة...

إقتباس :عندما طبقته وجدته يغيير عنوان الفورم حسب edit ويجلب عنوان الفورم الى edit

نعم اخي, حقيقة حصل معي هذا الشئ عندما جربت انا كود الأخ galag8 ولكن كان الهدف هو أخذ المعلومات من الفكرة... يعني لم انبه الأخ على هذا ... وعدلت على الكود انا قليلا حتى تمكنت من التخلص من هذا الشئ

لكن اخي ان كتبت انت الكود التالي

كود :
procedure TForm1.Button1Click(Sender: TObject); var forr, edi : THandle; Tex: string; begin forr := FindWindow('Notepad',nil); edi := FindWindowEx(forr,0,'Edit',nil); SetLength(Tex,Max_Path); SendMessage(edi,WM_GETTEXT,Max_Path,LongInt(@Tex[1])); edit1.Text:=Tex; end;

ماذا يحدث معك ؟ جربه ورد علي خبر... هل يتغير العنوان للفورم؟
هل تستطيع جلب المعلومات من المفكرة؟

بارك الله لك وشكرا على استفسارك Rolleyes
فرّج همّ المهمومين يا الله
اللهم فك قيد اسرانا و اسرى المسلمين
الرد
#10
السلام عليكم
نعم البرنامج يقوم بجلب المعلومات ،وارسالها الى المفكرة مع تغيير بسيط كما قلت هو تغيير حرف مع تحديد النص المراد ارساله قبل الامر
sendMessage
كود :
procedure TForm1.Button1Click(Sender: TObject); var forr, edi : THandle; Tex: string; begin forr := FindWindow('Notepad',nil); edi := FindWindowEx(forr,0,'Edit',nil); SetLength(Tex,Max_Path); SendMessage(edi,WM_GETTEXT,Max_Path,LongInt(@Tex[1])); //***204;***225;***200; ***199;***225;***228;***213; ***227;***228; ***199;***225;***227;***221;***223;***209;***201; memo1.Text:=tex; end; procedure TForm1.Button2Click(Sender: TObject); var forr, edi : THandle; Tex: string; begin forr := FindWindow('Notepad',nil); edi := FindWindowEx(forr,0,'Edit',nil); SetLength(Tex,Max_Path); Tex:= memo1.Text;// ***202;***219;***237;***237;***228; ***199;***225;***228;***213; ***199;***225;***227;***209;***199;***207; ***199;***209;***211;***199;***225;***229; SendMessage(edi,WM_SETTEXT,Max_Path,LongInt(@Tex[1]));// ***199;***209;***211;***199;***225; ***199;***225;***228;***213; ***199;***225;***236; ***199;***225;***227;***221;***223;***209;***201; end;
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم