08-10-13, 01:00 PM
(آخر تعديل لهذه المشاركة : 18-10-13, 03:46 AM {2} بواسطة الشاكي لله.)
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته
--
اهلا وسهلا بكم اخواني الكرام في اول مقالة من سلسلة [سلسلة التحكم]
في هذه المقالة سنتحدث عن طريقتين للتحكم ببرنامج ما من خلال السي شارب
لست اعني ضرورة تنفيذ الطرق بالسي شارب ، الاكواد نفسها يمكنك تحويلها إلى 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 للفئة :
بعدها نقوم باستدعاء الدالة SendLinkToIDM2 لنقوم بتحميل ملف من خلال برنامج IDM
الان علينا بملأ بارمترات الدالة التي عددها 11 بارمتار
وقد شرح موقع البرنامج البرامترات بالتفصيل :
الان كل شيئ يبدو واضحا بالنسبة لي ، سأقوم باضافة البارمترات للدالة
وسيكون الكود النهائي هكذا
كما ترى ان اغلب البارمترات قيمتها null لأن قيمها ليست متوفرة لدي ، لهذا تركتها null
وسيقوم برنامج IDM باللجوء الى الاعدادات الافتراضية وسيكمل المهمة
بعد تشغيل البرنامج سترى ظهور نافذة التحميل الخاصة ب IDM
طبعا يمكننا إلغاء ظهور نافذة التحميل من خلال تغيير قيمة البارمتار lFlags
-
كما نرا انه يمكننا التعامل مع البرامج من خلال مكتبات COM خاصتها
الكثير من البرامج التي تقوم بتنصيبها لديها مكتبة (او مكتبات) COM يمكنك التعامل معها
بنفس طريقة المثال السابق ، الاخ ناجي ابراهيم طبق نفس الفكرة على برنامج الوورد (المشاركة هنا)
--
--
--
ثانيا :- التحكم في برنامج من خلال دوال API
دوال Win32 API هي دوال تعتبر كنز لكل مبرمج يعمل تحت مظلة الوندوز وهي دوال غنية عن التعريف
في هذا الجزء سنقوم ببعض العمليات على form برنامج معين
بس اول شيئ بذكر لكم اهم الدوال التي تتحكم في البرنامج وتتعامل معها
-
1- FindWindow : الحصول على مقبض form
2- FindWindowEx : الحصول على مقبض فورم او كنترول داخل TopLevel form
2-SendMessage : تنفيذ عملية معينة على فورم (قائمة العمليات المتاحة هنا)
3-MoveWindow : تحريك فورم او تغيير ابعاده
4-SetParent : تغيير مكان الفورم ليكون داخل مكان معين
5-SetForegroundWindow : جعل فورم ما في المقدمة
-
ربما توجد دوال اخرى لكن هذي اهم الدوال التي تعاملت معها سابقا
وسأقوم الان بعرض مثال لكل دالة وننتهي من هذا الموضوع .
-----
FindWindow - الحصول على مقبض برنامج Notepad :
--
FindWindowEx + SendMessage : الضغط على زر داخل برنامج الحاسبة :
مقالة رائعة جدا للضغط على زر داخل الحاسبة
طبعا بإمكان دالة SendMessage عمل الكثير ، منها الغاء تفعيل زر او حذفه او ارسال نص للبرنامج وغيرها ..
--
MoveWindow : تغيير مكان وابعاد فورم برنامج النوت باد :
نرى انه في كل العمليات نحتاج الى الحصول على المقبض ، لذلك دالة findwindow
ضرورية جدا ، ولكن يمكنك الاستغناء عنها بكتابة كود في السي شارب يمكنك من الحصول
على مقبض اي نافذة
--
SetParent : تغيير مكان عرض فورم برنامج إلى داخل برنامجي
لاحظ هذه المرة قمت بالاستغناء عن FindWindow وقمت بجلب المقبض من خلال Process
النتيجة :
--
SetForegroundWindow : دالة بسيطة تقوم بجعل فورم ما في المقدمة
--
طبعا عن الحديث عن دوال API لاتنسى اضافة مجال الاسماء التالي :
--
--
--
ثالثا :- الخاتمة
اتمنى انكم قد استفدتم من هذا المقال البسيط
وارجو انني فد وفقت في ايصال المعلومة
والله الموفق ، والسلام عليكم
إنتهى
السلام عليكم ورحمة الله وبركاته
--
اهلا وسهلا بكم اخواني الكرام في اول مقالة من سلسلة [سلسلة التحكم]
في هذه المقالة سنتحدث عن طريقتين للتحكم ببرنامج ما من خلال السي شارب
لست اعني ضرورة تنفيذ الطرق بالسي شارب ، الاكواد نفسها يمكنك تحويلها إلى 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 لنقوم بتحميل ملف من خلال برنامج IDM
PHP كود :
IDM.SendLinkToIDM2
الان علينا بملأ بارمترات الدالة التي عددها 11 بارمتار
وقد شرح موقع البرنامج البرامترات بالتفصيل :
إقتباس :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", null, null, null, null, null, "C:/1", "vb4arb Test", 0, null, string.Empty);
كما ترى ان اغلب البارمترات قيمتها null لأن قيمها ليست متوفرة لدي ، لهذا تركتها null
وسيقوم برنامج IDM باللجوء الى الاعدادات الافتراضية وسيكمل المهمة
بعد تشغيل البرنامج سترى ظهور نافذة التحميل الخاصة ب IDM
طبعا يمكننا إلغاء ظهور نافذة التحميل من خلال تغيير قيمة البارمتار 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 lpClassName, string lpWindowName);
private void button1_Click(object sender, EventArgs 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 hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
private void button1_Click(object sender, EventArgs e)
{
IntPtr handle = FindWindow(null, "Untitled - Notepad");
MoveWindow(handle, 0, 0, 100, 100, true);
}
نرى انه في كل العمليات نحتاج الى الحصول على المقبض ، لذلك دالة findwindow
ضرورية جدا ، ولكن يمكنك الاستغناء عنها بكتابة كود في السي شارب يمكنك من الحصول
على مقبض اي نافذة
--
SetParent : تغيير مكان عرض فورم برنامج إلى داخل برنامجي
PHP كود :
[DllImport("user32.dll", SetLastError = true)]
internal static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
private void Form1_Load(object sender, EventArgs 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(Calchandle, this.Handle); //مكان الفورم الجديد
MoveWindow(Calchandle, 0, 0, this.Width - 10, this.Height -10, false); // تغغير مقاسات ومكان الحاسبة داخل الفورم
this.Refresh();
}
لاحظ هذه المرة قمت بالاستغناء عن FindWindow وقمت بجلب المقبض من خلال Process
النتيجة :
--
SetForegroundWindow : دالة بسيطة تقوم بجعل فورم ما في المقدمة
PHP كود :
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetForegroundWindow(IntPtr hWnd);
private void button1_Click(object sender, EventArgs e)
{
IntPtr Calchandle = FindWindow(null, "Calculator");
SetForegroundWindow(Calchandle);
}
--
طبعا عن الحديث عن دوال API لاتنسى اضافة مجال الاسماء التالي :
PHP كود :
using System.Runtime.InteropServices;
--
--
--
ثالثا :- الخاتمة
اتمنى انكم قد استفدتم من هذا المقال البسيط
وارجو انني فد وفقت في ايصال المعلومة
والله الموفق ، والسلام عليكم
إنتهى