03-10-12, 09:51 AM
كاتب الموضوع : SAFMEHDI
السلام عليكم
-
----------------------------
تعلم كيف تتحكم في برنامج آخر من برنامجك ...2
الجزئ الثاني
----------------------------------------
لقد تطرقت في هذا الموضوع تعلم التحكم في برنامج آخر من داخل برنامجك
الى مقدمة الى التحكم في النوافذ عن طريق المقبض و استخدام دوال Api الشرسة
في هذا الموضوع سنحاول الوصول الى جميع الأدوات الموجودة في النافذة أو في البرنامج
بحيث نستطيع تعديلهم كلهم لكن ليس كل على حدى (لي موضوع حول هذا ان شاء الله )
أولا ما يجب أن نفهم أن كل شيئ يتم و سيتم باستخدام دوال Api
اذن على بركة الله
افتح حبيبنا الفيجوال 2008 و انشئ مشروع جديد و سمه HandleTest2
أضف الى المشروع ليست بوكس (سنحتاجها لعرض اسماء الكنترولات ) و تكست بوكس و تايمر
الآن انتقل الى محرر الأكواد
صرح عن هذه الدالة GetForegroundWindow لقد شرحتها من قبل و هي خاصة للحصول على مقبض النوافذ
أضف هذه الدوال أيضا
GetWindowText للحصول على التكست
GetWindowTextLength للحصول على طول النص
أضف هذه الدالة البسيطة funcCallBackParent , ليست من دوال Api
و الآن هذه هي الدالة المهمة EnumChildWindows
هذه هي الدالة المهمة و التي ستمكننا من الوصول الى الكنترولات
وكما ترى لديها عدة براماتر مثل المقبض و برماتر الدالة السابقة(funcCallBackParent)
الآن أنشئ هذه ال Function
كما قلت سابقا سنقوم بوضع أسماء الكنترولات في الليست بوكس
لذا سنحتاج الى الدالتين GetWindowText & GetWindowTextLength
طريقة الا ستخدام سهلة
في EnumChildProc ضع الكود التالي
ليصبح الكود كما يلي
الآن أضف CheckBox و سمه Enabled
في حدث CheckBox1_CheckedChanged
ضع الكود التالي
ضع بعض التكست بوكس على الفورم و غير نصهم وقت التصميم
انتقل الى حدث التايمر و ضع الكود التالي
كما ترى في الكود فان الجزء المهم هو هذا الكود
استعملنا EnumChildWindows للوصول الى الكنترولات
حيث
TextBox1.Text يحمل عنوان مقبض النافذة المحددة
EnumChildProc الاجراء الذي نريد تنفيذه
IntPtr.Zero لا يهمك
جرب تشغيل البرنامج واختر أي نافذة وانظر الى الليست بوكس
--------------------------------------------------------
الآن سنحاول أن نقوم باخفاء كافة الكنترول الموجودة في الفورم (أي فورم)
أي جعل الخاصية visible=false
سنحتاج الى دالة api المسماة ShowWindow
الدالة تحمل 2 برمتر
البرمتر الأول خاص بالمقض
و البرمتر الثاني خاص بالاخفاء أو الاظهار
اذا أردت الاخفاء اجعل البرمتر الثاني يساوي 0 أما العكس اذ أردت الاظهار اجعل البرمتر 1
الاستعمال :
في الدالة EnumChildProc ضع الكود التالي
الآن جرب تشغيل البرنامج
اختر أي نافذة و انظر ماذا حدث
لقد اختفىت جميع الكنترولات الموجودة على سطح النافذة
و الآن اذا أردنا اظهارهم , ماذا نفعل ؟
استبدل الصفر بالواحد
هكذا
-----------------------------------------------------------
بنفس الطريقة نستطيع تغيير النص الموجود في التكست بوكس
سنحتاج الى داة Api
SetWindowText
في الدالة EnumChildProc ضع الكود التالي السلام عليكم
-
----------------------------
تعلم كيف تتحكم في برنامج آخر من برنامجك ...2
الجزئ الثاني
----------------------------------------
لقد تطرقت في هذا الموضوع تعلم التحكم في برنامج آخر من داخل برنامجك
الى مقدمة الى التحكم في النوافذ عن طريق المقبض و استخدام دوال Api الشرسة
في هذا الموضوع سنحاول الوصول الى جميع الأدوات الموجودة في النافذة أو في البرنامج
بحيث نستطيع تعديلهم كلهم لكن ليس كل على حدى (لي موضوع حول هذا ان شاء الله )
أولا ما يجب أن نفهم أن كل شيئ يتم و سيتم باستخدام دوال Api
اذن على بركة الله
افتح حبيبنا الفيجوال 2008 و انشئ مشروع جديد و سمه HandleTest2
أضف الى المشروع ليست بوكس (سنحتاجها لعرض اسماء الكنترولات ) و تكست بوكس و تايمر
الآن انتقل الى محرر الأكواد
صرح عن هذه الدالة GetForegroundWindow لقد شرحتها من قبل و هي خاصة للحصول على مقبض النوافذ
كود :
[color=#000000][COLOR=#007700]Declare Function [/color][color=#0000bb]GetForegroundWindow Lib [/color][color=#dd0000]"user32" [/color][color=#0000bb]Alias [/color][color=#dd0000]"GetForegroundWindow" [/color][color=#007700]() As [/color][COLOR=#0000bb]Integer
[/COLOR][/COLOR]
أضف هذه الدوال أيضا
GetWindowText للحصول على التكست
كود :
[COLOR=#000000][COLOR=#0000bb]
[/COLOR][color=#007700]Declare [/color][color=#0000bb]Auto [/color][color=#007700]Function [/color][color=#0000bb]GetWindowText Lib [/color][color=#dd0000]"user32" [/color][color=#007700]([/color][color=#0000bb]ByVal hWnd [/color][color=#007700]As [/color][color=#0000bb]IntPtr[/color][color=#007700], [/color][color=#0000bb]ByVal lpString [/color][color=#007700]As [/color][color=#0000bb]System[/color][color=#007700].[/color][color=#0000bb]Text[/color][color=#007700].[/color][color=#0000bb]StringBuilder[/color][color=#007700], [/color][color=#0000bb]ByVal nMaxCount [/color][color=#007700]As [/color][color=#0000bb]Integer[/color][color=#007700]) As [/color][COLOR=#0000bb]Integer
[/COLOR][/COLOR]
GetWindowTextLength للحصول على طول النص
كود :
[color=#000000][COLOR=#007700]Declare [/color][color=#0000bb]Auto [/color][color=#007700]Function [/color][color=#0000bb]GetWindowTextLength Lib [/color][color=#dd0000]"user32" [/color][color=#007700]([/color][color=#0000bb]ByVal hWnd [/color][color=#007700]As [/color][color=#0000bb]IntPtr[/color][color=#007700]) As [/color][COLOR=#0000bb]Integer
[/COLOR][/COLOR]
أضف هذه الدالة البسيطة funcCallBackParent , ليست من دوال Api
كود :
[color=#000000][COLOR=#007700]Public [/color][color=#0000bb]Delegate [/color][color=#007700]Function [/color][color=#0000bb]funcCallBackParent[/color][color=#007700]([/color][color=#0000bb]ByVal hWnd [/color][color=#007700]As [/color][color=#0000bb]IntPtr[/color][color=#007700], [/color][color=#0000bb]ByVal lParam [/color][color=#007700]As [/color][color=#0000bb]IntPtr[/color][color=#007700]) As [/color][COLOR=#0000bb]Boolean
[/COLOR][/COLOR]
و الآن هذه هي الدالة المهمة EnumChildWindows
كود :
[COLOR=#000000][COLOR=#0000bb]
Friend [/COLOR][color=#007700]Declare Function [/color][color=#0000bb]EnumChildWindows Lib [/color][color=#dd0000]"User32" [/color][color=#007700]([/color][color=#0000bb]ByVal hWndParent [/color][color=#007700]As [/color][color=#0000bb]IntPtr[/color][color=#007700], [/color][color=#0000bb]ByVal funcCallBack [/color][color=#007700]As [/color][color=#0000bb]funcCallBackParent[/color][color=#007700], [/color][color=#0000bb]ByVal lParam [/color][color=#007700]As [/color][color=#0000bb]IntPtr[/color][color=#007700]) As [/color][COLOR=#0000bb]Boolean
[/COLOR][/COLOR]
هذه هي الدالة المهمة و التي ستمكننا من الوصول الى الكنترولات
وكما ترى لديها عدة براماتر مثل المقبض و برماتر الدالة السابقة(funcCallBackParent)
الآن أنشئ هذه ال Function
كود :
[COLOR=#000000][COLOR=#0000bb]
[/COLOR][color=#007700]Public Function [/color][color=#0000bb]EnumChildProc[/color][color=#007700]([/color][color=#0000bb]ByVal hwnd [/color][color=#007700]As [/color][color=#0000bb]Long[/color][color=#007700], [/color][color=#0000bb]ByVal lParam [/color][color=#007700]As [/color][color=#0000bb]Long[/color][color=#007700]) As [/color][COLOR=#0000bb]Long
هنا نضع جميع العمليات التي نريدها
EnumChildProc [/COLOR][color=#007700]= [/color][COLOR=#0000bb]1
End [/COLOR][COLOR=#007700]Function
[/COLOR][/COLOR]
كما قلت سابقا سنقوم بوضع أسماء الكنترولات في الليست بوكس
لذا سنحتاج الى الدالتين GetWindowText & GetWindowTextLength
طريقة الا ستخدام سهلة
في EnumChildProc ضع الكود التالي
كود :
[color=#000000][COLOR=#0000bb]Dim Str [/color][color=#007700]As New [/color][color=#0000bb]System[/color][color=#007700].[/color][color=#0000bb]Text[/color][color=#007700].[/color][COLOR=#0000bb]StringBuilder
Str[/COLOR][color=#007700].[/color][color=#0000bb]Capacity [/color][color=#007700]= [/color][color=#0000bb]GetWindowTextLength[/color][color=#007700]([/color][color=#0000bb]hwnd[/color][color=#007700]) + [/color][COLOR=#0000bb]1
GetWindowText[/COLOR][color=#007700]([/color][color=#0000bb]hwnd[/color][color=#007700], [/color][color=#0000bb]Str[/color][color=#007700], [/color][color=#0000bb]Str[/color][color=#007700].[/color][color=#0000bb]Capacity[/color][COLOR=#007700])
[/COLOR][color=#0000bb]ListBox1[/color][color=#007700].[/color][color=#0000bb]Items[/color][color=#007700].[/color][color=#0000bb]Add[/color][color=#007700]([/color][color=#0000bb]Str[/color][color=#007700].[/color][color=#0000bb]ToString[/color][COLOR=#007700])
[/COLOR][/COLOR]
ليصبح الكود كما يلي
كود :
[COLOR=#000000][COLOR=#0000bb]
[/COLOR][color=#007700]Public Function [/color][color=#0000bb]EnumChildProc[/color][color=#007700]([/color][color=#0000bb]ByVal hwnd [/color][color=#007700]As [/color][color=#0000bb]Long[/color][color=#007700], [/color][color=#0000bb]ByVal lParam [/color][color=#007700]As [/color][color=#0000bb]Long[/color][color=#007700]) As [/color][COLOR=#0000bb]Long
Dim Str [/COLOR][color=#007700]As New [/color][color=#0000bb]System[/color][color=#007700].[/color][color=#0000bb]Text[/color][color=#007700].[/color][COLOR=#0000bb]StringBuilder
Str[/COLOR][color=#007700].[/color][color=#0000bb]Capacity [/color][color=#007700]= [/color][color=#0000bb]GetWindowTextLength[/color][color=#007700]([/color][color=#0000bb]hwnd[/color][color=#007700]) + [/color][COLOR=#0000bb]1
GetWindowText[/COLOR][color=#007700]([/color][color=#0000bb]hwnd[/color][color=#007700], [/color][color=#0000bb]Str[/color][color=#007700], [/color][color=#0000bb]Str[/color][color=#007700].[/color][color=#0000bb]Capacity[/color][COLOR=#007700])
[/COLOR][color=#0000bb]ListBox1[/color][color=#007700].[/color][color=#0000bb]Items[/color][color=#007700].[/color][color=#0000bb]Add[/color][color=#007700]([/color][color=#0000bb]Str[/color][color=#007700].[/color][color=#0000bb]ToString[/color][COLOR=#007700])
[/COLOR][color=#0000bb]EnumChildProc [/color][color=#007700]= [/color][COLOR=#0000bb]1
End [/COLOR][COLOR=#007700]Function
[/COLOR][/COLOR]
الآن أضف CheckBox و سمه Enabled
في حدث CheckBox1_CheckedChanged
ضع الكود التالي
كود :
[COLOR=#000000][COLOR=#0000bb]
[/COLOR][color=#007700]If [/color][color=#0000bb]Me[/color][color=#007700].[/color][color=#0000bb]CheckBox1[/color][color=#007700].[/color][color=#0000bb]Checked [/color][color=#007700]= [/color][COLOR=#0000bb]True Then
Timer1[/COLOR][color=#007700].[/color][color=#0000bb]Enabled [/color][color=#007700]= [/color][COLOR=#0000bb]True
End [/COLOR][COLOR=#007700]If
[/COLOR][/COLOR]
ضع بعض التكست بوكس على الفورم و غير نصهم وقت التصميم
انتقل الى حدث التايمر و ضع الكود التالي
كود :
[COLOR=#000000][COLOR=#0000bb]
[/COLOR][color=#007700]If [/color][color=#0000bb]CheckBox1[/color][color=#007700].[/color][color=#0000bb]Checked [/color][color=#007700]= [/color][COLOR=#0000bb]True Then
TextBox1[/COLOR][color=#007700].[/color][color=#0000bb]Text [/color][color=#007700]= [/color][COLOR=#0000bb]GetForegroundWindow
EnumChildWindows[/COLOR][color=#007700]([/color][color=#0000bb]TextBox1[/color][color=#007700].[/color][color=#0000bb]Text[/color][color=#007700], [/color][color=#0000bb]AddressOf EnumChildProc[/color][color=#007700], [/color][color=#0000bb]IntPtr[/color][color=#007700].[/color][color=#0000bb]Zero[/color][COLOR=#007700])
[/COLOR][color=#0000bb]Timer1[/color][color=#007700].[/color][color=#0000bb]Enabled [/color][color=#007700]= [/color][COLOR=#0000bb]False
End [/COLOR][COLOR=#007700]If
[/COLOR][/COLOR]
كما ترى في الكود فان الجزء المهم هو هذا الكود
كود :
[color=#000000][COLOR=#0000bb] EnumChildWindows[/color][color=#007700]([/color][color=#0000bb]TextBox1[/color][color=#007700].[/color][color=#0000bb]Text[/color][color=#007700], [/color][color=#0000bb]AddressOf EnumChildProc[/color][color=#007700], [/color][color=#0000bb]IntPtr[/color][color=#007700].[/color][color=#0000bb]Zero[/color][COLOR=#007700])
[/COLOR][/COLOR]
استعملنا EnumChildWindows للوصول الى الكنترولات
حيث
TextBox1.Text يحمل عنوان مقبض النافذة المحددة
EnumChildProc الاجراء الذي نريد تنفيذه
IntPtr.Zero لا يهمك
جرب تشغيل البرنامج واختر أي نافذة وانظر الى الليست بوكس
--------------------------------------------------------
الآن سنحاول أن نقوم باخفاء كافة الكنترول الموجودة في الفورم (أي فورم)
أي جعل الخاصية visible=false
سنحتاج الى دالة api المسماة ShowWindow
كود :
[COLOR=#000000][COLOR=#0000bb]
[/COLOR][color=#007700]Declare Function [/color][color=#0000bb]ShowWindow Lib [/color][color=#dd0000]"user32" [/color][color=#007700]([/color][color=#0000bb]ByVal hwnd [/color][color=#007700]As [/color][color=#0000bb]Integer[/color][color=#007700], [/color][color=#0000bb]ByVal nCmdShow [/color][color=#007700]As [/color][color=#0000bb]Integer[/color][color=#007700]) As [/color][COLOR=#0000bb]Integer
[/COLOR][/COLOR]
الدالة تحمل 2 برمتر
البرمتر الأول خاص بالمقض
و البرمتر الثاني خاص بالاخفاء أو الاظهار
اذا أردت الاخفاء اجعل البرمتر الثاني يساوي 0 أما العكس اذ أردت الاظهار اجعل البرمتر 1
الاستعمال :
في الدالة EnumChildProc ضع الكود التالي
كود :
[COLOR=#000000][COLOR=#0000bb]
ShowWindow[/COLOR][color=#007700]([/color][color=#0000bb]hwnd[/color][color=#007700], [/color][color=#0000bb]0[/color][COLOR=#007700])
[/COLOR][/COLOR]
الآن جرب تشغيل البرنامج
اختر أي نافذة و انظر ماذا حدث
لقد اختفىت جميع الكنترولات الموجودة على سطح النافذة
و الآن اذا أردنا اظهارهم , ماذا نفعل ؟
استبدل الصفر بالواحد
هكذا
كود :
[COLOR=#000000][COLOR=#0000bb]
ShowWindow[/COLOR][color=#007700]([/color][color=#0000bb]hwnd[/color][color=#007700], [/color][color=#0000bb]1[/color][COLOR=#007700])
[/COLOR][/COLOR]
-----------------------------------------------------------
بنفس الطريقة نستطيع تغيير النص الموجود في التكست بوكس
سنحتاج الى داة Api
SetWindowText
كود :
[COLOR=#000000][COLOR=#0000bb]
[/COLOR][color=#007700]Declare [/color][color=#0000bb]Auto [/color][color=#007700]Function [/color][color=#0000bb]SetWindowText Lib [/color][color=#dd0000]"user32" [/color][color=#007700]([/color][color=#0000bb]ByVal hWnd [/color][color=#007700]As [/color][color=#0000bb]IntPtr[/color][color=#007700], [/color][color=#0000bb]ByVal Text [/color][color=#007700]As [/color][color=#0000bb]String[/color][color=#007700]) As [/color][COLOR=#0000bb]Boolean
[/COLOR][/COLOR]
كود :
[color=#000000][COLOR=#0000bb] SetWindowText[/color][color=#007700]([/color][color=#0000bb]hwnd[/color][color=#007700], [/color][color=#dd0000]"Smp3"[/color][COLOR=#007700])
[/COLOR][/COLOR]
الآن جرب البرنامج ولاحظ تغير خاصية Text الخاصة ب TextBox الى "Smp3"
و بهذا نصل الى نهاية الجزء الثاني
أترككم لتحاولوا ان تقوموا باستخدام بعض الدوال الأخرى مثل تفعيل وتعطيل الكونترول و... و ... من دوال Api
و هذا مثال لكل ما قمنا به
http://vb4arb.com/vb/uploaded/18_01349243365.zip
أتمنى أن يعجبكم الموضوع