تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
[سلسلة التحكم] {1} - طرق التحكم في البرامج
#1
بسم الله الرحمن الرحيم

السلام عليكم ورحمة الله وبركاته


--

اهلا وسهلا بكم اخواني الكرام في اول مقالة من سلسلة [سلسلة التحكم]

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

لست اعني ضرورة تنفيذ الطرق بالسي شارب ، الاكواد نفسها يمكنك تحويلها إلى vb.net

وتنفيذها هناك ، ولكن بما اننا في قسم السي شارب فاضطررت لتقديم الدروس بلغة #c

نكتفي الان بهذه المقدمة وندخل الى صلب الموضوع .




--
--
--



صفر :- أجزاء المقالة

اولا : التعامل مع برنامج من خلال مكتبات COM
ثانيا : التحكم في برنامج من خلال دوال API
ثالثا : الخاتمة




--
--
--



اولا :- التعامل مع برنامج من خلال مكتبات COM


بعض البرامج وخاصة البرامج الكبيرة ، تقوم بإنشاء مكتبة COM تمكننا من التعامل مع برامجها

ابسط مثال هو برنامج IDM الذي يمكننا طلب التحميل منه من خلال برنامجنا

وهذا باستعمال مكتبة COM خاصته.

والمسمى بـ IDMan 1.0 Type library

بعد ان نقوم بإضافتها سنتمكن من استدعاء بعض دوال برنامج IDM للقيام بعملية معينة

كتحميل ملف . ((احيانا توجد اكثر من مكتبة COM للتعامل مع البرنامج الهدف))

في الصورة تحت ، تشوف هناك 4 مكتبات للتعامل مع برنامج IDM



بعد اضافة IDMan 1.0 Type library

نرى انه تم اضافة مكتبة اسمها IDManLib الى References

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

ونكتب اسم المكتبة لنرى محتوياتها



نرى وجود 1 كلاس و3 انترفيس ، بما ان الانترفيس هو مجرد كلاس فارغ نقوم بتركه

ولهذا يضل امامنا كلاس (فئة) لانعلم عنها شيئا واسمها CIDMLinkTransmitterClass .

طبيعي اي إنسان مايعرف عن شيئ معين يقوم بالسؤال او البحث ، ونحن في هذا

العصر يوجد لدينا الانترنت وقوقل مما يسهل علينا عملية البحث .

كيف نقوم بالبحث ؟؟

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

وهذا ماسنقوم به :



اول نتيجة ظهرت تبدو هي ضالتنا ، سنقوم بالدخول عليها ، ليظهر لنا موقع البرنامج

وفيه شرح كامل عن استخدام الفئة :



بعد قرائتي للصفحة ، عرفت انه توجد هناك دالتين باسم
SendLinkToIDM2
SendLinksArray


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

ماعلينا الان سوا تطبيق ذلك بالسي شارب .

--

بما ان اعضاء الفئة ليست Static ، سنقوم بإنشاء Instance للفئة :

PHP كود :
IDManLib.CIDMLinkTransmitterClass IDM = new IDManLib.CIDMLinkTransmitterClass(); 

بعدها نقوم باستدعاء الدالة SendLinkToIDM2 لنقوم بتحميل ملف من خلال برنامج IDMSmile

PHP كود :
IDM.SendLinkToIDM2 

الان علينا بملأ بارمترات الدالة التي عددها 11 بارمتار Big Grin

وقد شرح موقع البرنامج البرامترات بالتفصيل :

إقتباس :Parameters of SendLinkToIDM2 function:
bstrUrl - Url to download
bstrReferer - Referer
bstrCookies - cookies
bstrData - PostData (if using POST method)
bstrUser - UserName (if server requires authentication)
bstrPassword - Password
bstrLocalPath - LocalPath (where to save a file on your computer)
bstrLocalFileName - LocalFileName (file name to save with)
lFlags - Flags, can be zero or a combination of the following values:
1 - do not show any confirmations dialogs;
2 - add to queue only, do not start downloading.
reserved1 - can be used to set a specific user-agent header with the following way:
reserved1.vt = VT_BSTR; reserved1.bstrVal = pbstrUA; if you don’t need to specify a
user agent, then reserved1.vt should be set to VT_EMPTY;
reserved2 - not used, you should set reserved2.vt to VT_EMPTY;

الان كل شيئ يبدو واضحا بالنسبة لي ، سأقوم باضافة البارمترات للدالة

وسيكون الكود النهائي هكذا
PHP كود :
IDManLib.CIDMLinkTransmitterClass IDM = new IDManLib.CIDMLinkTransmitterClass();
            
IDM.SendLinkToIDM2("http://www.google.com"nullnullnullnullnull"C:/1""vb4arb Test"0nullstring.Empty); 

كما ترى ان اغلب البارمترات قيمتها null لأن قيمها ليست متوفرة لدي ، لهذا تركتها null

وسيقوم برنامج IDM باللجوء الى الاعدادات الافتراضية وسيكمل المهمة Big Grin

بعد تشغيل البرنامج سترى ظهور نافذة التحميل الخاصة ب IDM Cool



طبعا يمكننا إلغاء ظهور نافذة التحميل من خلال تغيير قيمة البارمتار lFlags

-

كما نرا انه يمكننا التعامل مع البرامج من خلال مكتبات COM خاصتها

الكثير من البرامج التي تقوم بتنصيبها لديها مكتبة (او مكتبات) COM يمكنك التعامل معها

بنفس طريقة المثال السابق ، الاخ ناجي ابراهيم طبق نفس الفكرة على برنامج الوورد (المشاركة هنا)





--
--
--




ثانيا :- التحكم في برنامج من خلال دوال API


دوال Win32 API هي دوال تعتبر كنز لكل مبرمج يعمل تحت مظلة الوندوز وهي دوال غنية عن التعريف

في هذا الجزء سنقوم ببعض العمليات على form برنامج معين

بس اول شيئ بذكر لكم اهم الدوال التي تتحكم في البرنامج وتتعامل معها


-
1- FindWindow : الحصول على مقبض form
2- FindWindowEx : الحصول على مقبض فورم او كنترول داخل TopLevel form
2-SendMessage : تنفيذ عملية معينة على فورم (قائمة العمليات المتاحة هنا)
3-MoveWindow : تحريك فورم او تغيير ابعاده
4-SetParent : تغيير مكان الفورم ليكون داخل مكان معين
5-SetForegroundWindow : جعل فورم ما في المقدمة

-

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

وسأقوم الان بعرض مثال لكل دالة وننتهي من هذا الموضوع .

-----

FindWindow - الحصول على مقبض برنامج Notepad :

PHP كود :
[DllImport("user32.dll"SetLastError true)]
        static 
extern IntPtr FindWindow(string lpClassNamestring lpWindowName);
        private 
void button1_Click(object senderEventArgs e)
        {
MessageBox.Show(FindWindow(null"Untitled - Notepad").ToInt32().ToString());
        } 


--


FindWindowEx + SendMessage : الضغط على زر داخل برنامج الحاسبة :

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


--


MoveWindow : تغيير مكان وابعاد فورم برنامج النوت باد :

PHP كود :
[DllImport("user32.dll"SetLastError true)]
        
internal static extern bool MoveWindow(IntPtr hWndint Xint Yint nWidthint nHeightbool bRepaint);
        [
DllImport("user32.dll"SetLastError true)]
        static 
extern IntPtr FindWindow(string lpClassNamestring lpWindowName);

        private 
void button1_Click(object senderEventArgs e)
        {
            
IntPtr handle FindWindow(null"Untitled - Notepad");
            
MoveWindow(handle00100100true);
        } 

نرى انه في كل العمليات نحتاج الى الحصول على المقبض ، لذلك دالة findwindow

ضرورية جدا ، ولكن يمكنك الاستغناء عنها بكتابة كود في السي شارب يمكنك من الحصول

على مقبض اي نافذة


--


SetParent : تغيير مكان عرض فورم برنامج إلى داخل برنامجي
PHP كود :
[DllImport("user32.dll"SetLastError true)]
        
internal static extern bool MoveWindow(IntPtr hWndint Xint Yint nWidthint nHeightbool bRepaint);
        [
DllImport("user32.dll"SetLastError true)]
        static 
extern IntPtr SetParent(IntPtr hWndChildIntPtr hWndNewParent);


        private 
void Form1_Load(object senderEventArgs e)
        {
            
System.Diagnostics.Process p System.Diagnostics.Process.Start("calc");
            
            
//حلقة لإنتظار ظهور الفورم
            
{
            
re:
                
System.Threading.Thread.Sleep(500);
                while (
p.MainWindowHandle == IntPtr.Zero) { goto re; }
            }

            
IntPtr Calchandle p.MainWindowHandle;
            
SetParent(Calchandlethis.Handle); //مكان الفورم الجديد
            
MoveWindow(Calchandle00this.Width 10this.Height -10false); // تغغير مقاسات ومكان الحاسبة داخل الفورم
            
this.Refresh();
        } 

لاحظ هذه المرة قمت بالاستغناء عن FindWindow وقمت بجلب المقبض من خلال Process

النتيجة :




--


SetForegroundWindow : دالة بسيطة تقوم بجعل فورم ما في المقدمة

PHP كود :
[DllImport("user32.dll"SetLastError true)]
        static 
extern IntPtr FindWindow(string lpClassNamestring lpWindowName);

        [
DllImport("user32.dll")]
        [return: 
MarshalAs(UnmanagedType.Bool)]
        static 
extern bool SetForegroundWindow(IntPtr hWnd);


        private 
void button1_Click(object senderEventArgs e)
        {
            
IntPtr Calchandle FindWindow(null"Calculator");
            
SetForegroundWindow(Calchandle);
        } 


--


طبعا عن الحديث عن دوال API لاتنسى اضافة مجال الاسماء التالي :

PHP كود :
using System.Runtime.InteropServices




--
--
--



ثالثا :- الخاتمة

اتمنى انكم قد استفدتم من هذا المقال البسيط

وارجو انني فد وفقت في ايصال المعلومة

والله الموفق ، والسلام عليكم





إنتهى
الرد }}}
#2
السلام عليكم

بارك الله فيك اخونا المبدع جزاك الله خيرا

درس منظم ورائع ومفيد

ننتظر مزيدكSmile

تحياتي
الرد }}}
تم الشكر بواسطة: ali.alfoly , الشاكي لله
#3
(08-10-13, 01:56 PM)Sajad كتب : السلام عليكم

بارك الله فيك اخونا المبدع جزاك الله خيرا

درس منظم ورائع ومفيد

ننتظر مزيدكSmile

تحياتي

السلام عليكم

بالفعل كما قال اخى سجآد

وننتظر مثل هذه الشروح الممتازة ربنا يجعلها فى موازين حسناتك

وجزاك الله خيرا
الرد }}}
تم الشكر بواسطة: الشاكي لله
#4
تسلم بارك الله فيك اخي الكريم
الرد }}}
تم الشكر بواسطة: الشاكي لله
#5
درس ممتاز و رائع, و لكن لي سؤال, هل إستخدام API بكثرة داخل المشروع تجعله بطئ نسبياً أم ليس لها هذا التأثير عليه؟


السلام عليكم Smile
الرد }}}
تم الشكر بواسطة:
#6
والله ماعتقد ابدا

لان اصلا اغلب دوال الدوت نت تستدعي دوال API WIN32

مثلا Form.Focus تقوم خلف الكواليس بارسال WM_Setfocus الى الفورم

فلو قمت بارسال رسالة WM_Setfocus بواسطة دالة SendMessage فاني اختصرت الطريق لا اكثر


--

مثال اخر Cursor.Position .. تقوم خلف الكواليس باستدعاء دالة GetCursorPos وهذا كودها :

PHP كود :
[DllImport("user32.dll")]
[return: 
MarshalAs(UnmanagedType.Bool)]
static 
extern bool GetCursorPos(out POINT lpPoint); 


فلو قمت مباشرة بطلب الدالة الي فوق بكون الموضوع مختصر

لذلك لا اضن ابدا انها تبطئ البرنامج لأن الدوت نت وجميع برامج الوندوز تعتمد على الAPI بشكل كامل
الرد }}}
تم الشكر بواسطة: Casper-x
#7
مشكور على التوضيح أخي محمد Smile


السلام عليكم
الرد }}}
تم الشكر بواسطة:
#8
زادك الله علما نفع به الناس
الرد }}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  [سلسلة التحكم] {4} - التحكم عن بعد بواسطة خدمة الويب الشاكي لله 7 9,569 12-07-21, 02:34 PM
آخر رد: devante.celvin
  [سلسلة التحكم] {5} - التحكم بالمصباح بواسطة الـ USB و Arduino الشاكي لله 12 25,186 30-12-19, 01:38 AM
آخر رد: mohammed abdalsamed
  [سلسلة التحكم] {3} - خدمة الويب (Web Service) الشاكي لله 9 12,810 25-09-19, 05:47 PM
آخر رد: al9atl
  تجميعية مقالات [سلسلة التحكم] الشاكي لله 10 7,503 15-07-19, 09:14 AM
آخر رد: mrsalnet
  [سلسلة التعامل مع الويب] - ارسال الطلبات HttpWebRequset الشاكي لله 42 28,394 29-05-19, 10:38 PM
آخر رد: egbest2
  [C#.NET] سلسلة حلقات نضف كودك Devahmedsalim 1 2,625 10-10-17, 11:28 PM
آخر رد: nani49
  [سلسلة ادوات المبرمج] {2} - اداة تحليل صفحات الويب HAPXPathFinder الشاكي لله 10 8,492 30-08-17, 06:49 PM
آخر رد: ابو روضة
  [سلسلة التحكم] {2} - التحكم بواسطة Remoting الشاكي لله 8 10,353 06-12-16, 04:22 PM
آخر رد: الشاكي لله
  [سلسلة التعامل مع الويب] تحليل الصفحات باستخدام HtmlAgilityPack الشاكي لله 9 7,024 25-09-16, 12:19 PM
آخر رد: ابراهيم كركوكي
  [سلسلة التحكم] {6} - التحكم في البرامج بطريقة SendMessage الشاكي لله 3 4,205 12-02-16, 02:01 PM
آخر رد: nani49

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


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