السلام عليكــم ورحمـة الله وبركاتــه ،،
كنت ذات يوم عند أحد أصحابى وكان فى هذا اليوم قد قام بتحميل نسخة ويندوز جديدة قد تم عليها بعض التعديلات وبها بعض البرامج الإضافية ,, كان أحد هذه البرامج برنامج يقوم بتغيير خصائص زر Start المعروف
صاحبى هذا كان فى بداية تعلم البرمجة لذلك كان معجبا جدا بهذا البرنامج :D
وسألنى: هل تستطيع عمل برنامج مثل هذا؟ :D
فى اعتقاده أن هذا البرنامج من أعقد البرامج لأنه يعدل على شئ يخص الويندوز وليس لبرنامجه علاقة به
طبعا هو لا يعرف ماهى الـAPI وماهى إمكانياتها :D :D
المهم ,, قمت بكتابة برنامج صغير ليفعل ما يريد ولم يكن يتوقع أن المسألة بهذه السهولة والبساطة
ولهذا (ولا حول ولا قوة إلا بالله) بدلا من أن يكمل تعلمه للبرمجة اتجه مباشرة لتعلم الـAPI :wacko: :blink:
المهم ,, أعتذر على الإطالة
أردت أن أضع الكود هنا للفائدة ولأنى رأيت بعض الأسئلة (لا أذكر فى أى قسم) عن كيفية تغيير كلمة Start
بسم الله نبدأ
الخطوات:
1- فتح مشروع جديد
2- إضافة مربع نص باسم txtStartText
3- ثلاثة أزرار بالأسماء btnChangeText , btnHide , btnShow
الأكواد
بالطبع سيكون الكود باستخدام دوال الـAPI
لذلك تكون الخطوة الأولى هى استيراد مجال الأسماء System.Runtime.InteropServices
Imports System.Runtime.InteropServices
الخطوة الثانية هى الإعلان عن الدوال التى سنستخدمها وفى برنامجنا هذا سنحتاج إلى أربعة دوال فقط
هى:
1- الدالة FindWindow للحصول على مقبض شريط المهام
2- الدالة FindWindowEx للحصول على مقبض زر Start
3- الدالة SetWindowText لتغيير النص
4- الدالة SetWindowPos لإخفاء/إظهار/تحريك الزر
الإعلان عنها يكون بهذه الطريقة
<DllImport("User32.dll", EntryPoint:="FindWindowA")> _
Private Shared Function FindWindow(ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
End Function
<DllImport("User32.dll", EntryPoint:="FindWindowExA")> _
Private Shared Function FindWindowEx(ByVal hWndParent As Integer, ByVal hWndAfter As Integer, ByVal lpsz1 As String, ByVal lpsz2 As String) As Integer
End Function
<DllImport("User32.dll", EntryPoint:="SetWindowTextA")> _
Private Shared Function SetWindowText(ByVal hwnd As Integer, ByVal lpString As String) As Integer
End Function
<DllImport("User32.dll")> _
Private Shared Function SetWindowPos(ByVal hwnd As Integer, ByVal hWndInsertAfter As Integer, ByVal left As Integer, ByVal top As Integer, ByVal width As Integer, ByVal height As Integer, ByVal wFlags As Integer) As Integer
End Functionنقوم بتعريف بعض الثوابت والمتغيرات التى سيتم العمل بها وفى حالتنا سنحتاج لثابتين ومتغيرين
الثابتين هما: SWP_HIDEWINDOW , SWP_SHOWWINDOW
والمتغيرين هما: taskbarHandle , startButtonHandle
وكلها من النوع Integer
Private Const SWP_HIDEWINDOW As Integer = &H80 Private Const SWP_SHOWWINDOW As Integer = &H40 Dim taskbarHandle, startButtonHandle As Integer
المتغير taskbarHandle سنقوم باستخدامه لتخزين مقبض شريط المهام
أما startButtonHandle فسيستخدم لتخزين مقبض زر Start
طريقة الحصول على هذه القيم:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
taskbarHandle = FindWindow("Shell_TrayWnd", Nothing)
If taskbarHandle <> 0 Then
startButtonHandle = FindWindowEx(taskbarHandle, 0, "BUTTON", Nothing)
Else
MsgBox("Cann't get the task-bar handle", MsgBoxStyle.Exclamation)
End If
End Subالسطر الأول من الكود يقوم باستدعاء الدالة FindWindow والتى أشرنا فى المقدمة أنها تستخدم هنا للحصول على مقبض شريط المهام والمعامل الذى قمنا بتمريره Shell_TrayWnd هو اسم الفئة الخاصة بشريط المهام
ملحوظة: لكل أداة فئة تتبعها فمثلا مربع النص يتبع الفئة EDIT واللافتة (Label) تتبع الفئة STATIC والأزرار تتبع الفئة BUTTON وهكذا
بعد هذا السطر سيحمل المتغير taskbarHandle قيمة مقبض شريط المهام
وبما أن زر Start موجود داخل شريط المهام فلابد للحصول على المقبض الخاص به أن نبحث داخل شريط المهام عنه ولذلك استخدمنا الدالة FindWindowEx والتى تمكننا من البحث عن نافذة داخل نافذة أخرى
ملحوظة: مصطلح نافذة يطلق على جميع الأدوات التى يمكن استخدامها وليس النموذج فقط كما يظن البعض
المهم ,,
الدالة FindWindowEx تستقبل فى المعامل الأول مقبض النافذة التى سنبحث بداخلها وفى حالتنا هذه سيكون المتغير taskbarHandle لأننا نبحث بداخله عن زر Start
المعامل الثانى يستخدم لتحديد المكان الذى نريد بدء عملية البحث منه وهو عبارة عن مقبض نافذة يتم البحث من بعدها داخل النافذة الأم وبما أننا نريد البحث من أول نافذة على شريط المهام قمنا باستخدام القيمة صفر
المعامل الثالث عبارة عن اسم الفئة التى تتبعها النافذة التى نبحث عنها وبما أنه زر فهو يتبع الفئة BUTTON
المعامل الرابع عبارة عن عنوان النافذة التى نبحث عنها (إذا كنا نبحث عن نافذة بعنوان معين فيمكن استخدام هذا المعامل) لكننا لم نستخدمه هنا لأننا لا نعرف النص/العنوان الموجود على الزر وفى هذه الحالة فإن أول حالة تطابق المعاملات الأخرى سيتم العودة بالمقبض الخاص بها
أطلت عليكم :huh:
المهم بعد تنفيذ هذا الكود سنجد فى المتغير startButtonHandle المقبض الخاص بزر Start
وكما وضحت فى موضوع سابق عن كيفية كشف النص المكتوب على شكل كلمة مرور
قلت أنك بمجرد الحصول على مقبض النافذة يمكنك التعامل معها وتعديل خصائصها كما تشاء كأنها فى برنامجك الخاص
نبدأ الآن فى كتابة أكواد أزرار تغيير الخصائص
أولا: زر تغيير النص
قلنا أننا سنستخدم الدالة SetWindowText
Private Sub btnChangeText_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnChangeText.Click SetWindowText(startButtonHandle, Me.txtStartText.Text) End Sub
الدالة لها معاملين الأول هو مقبض النافذة التى سيتم تغيير النص الخاص بها والثانى هو النص الجديد
ثانيا: زر الإخفاء
Private Sub btnHide_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnHide.Click SetWindowPos(startButtonHandle, 0, 0, 0, 0, 0, SWP_HIDEWINDOW) End Sub
ثالثا: زر الإظهار
هو نفس الكود السابق لكن غير المعامل الأخير إلى SWP_SHOWWINDOW
يمكنك أيضا استخدام نفس الدالة (SetWindowPos) لتغيير أبعاد الزر فلو لاحظت المعاملات 3,4,5,6 لوجدتها خاصة بأبعاد النافذة Left,Top,Width,Height يمكنك تعديل قيم هذه المعاملات كما تشاء وسيتم تغيير أبعاد الزر
الكود بالكامل
Imports System.Runtime.InteropServices
Public Class Form1
<DllImport("User32.dll", EntryPoint:="FindWindowA")> _
Private Shared Function FindWindow(ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
End Function
<DllImport("User32.dll", EntryPoint:="FindWindowExA")> _
Private Shared Function FindWindowEx(ByVal hWndParent As Integer, ByVal hWndAfter As Integer, ByVal lpsz1 As String, ByVal lpsz2 As String) As Integer
End Function
<DllImport("User32.dll", EntryPoint:="SetWindowTextA")> _
Private Shared Function SetWindowText(ByVal hwnd As Integer, ByVal lpString As String) As Integer
End Function
<DllImport("User32.dll")> _
Private Shared Function SetWindowPos(ByVal hwnd As Integer, ByVal hWndInsertAfter As Integer, ByVal left As Integer, ByVal top As Integer, ByVal width As Integer, ByVal height As Integer, ByVal wFlags As Integer) As Integer
End Function
Private Const SWP_HIDEWINDOW As Integer = &H80
Private Const SWP_SHOWWINDOW As Integer = &H40
Dim taskbarHandle, startButtonHandle As Integer
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
taskbarHandle = FindWindow("Shell_TrayWnd", Nothing)
If taskbarHandle <> 0 Then
startButtonHandle = FindWindowEx(taskbarHandle, 0, "BUTTON", Nothing)
Else
MsgBox("Cann't get the task-bar handle", MsgBoxStyle.Exclamation)
End If
End Sub
Private Sub btnChangeText_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnChangeText.Click
SetWindowText(startButtonHandle, Me.txtStartText.Text)
End Sub
Private Sub btnHide_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnHide.Click
SetWindowPos(startButtonHandle, 0, 0, 0, 90, 32, SWP_HIDEWINDOW)
End Sub
Private Sub btnShow_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnShow.Click
SetWindowPos(startButtonHandle, 0, 0, 0, 90, 32, SWP_SHOWWINDOW)
End Sub
End Class
