تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
التعامل مع Registry - الجزء الأول ( شرح الدوال )
#1
كاتب الموضوع : ahmed-1a


بسم الله الرحمن الرحيم

التعامل مع Registry - الجزء الأول ( شرح الدوال )

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

Registry عبارة عن عدد من السجلات التي يتم حفظ بيانات بها ، قد تكون خاصة بالنظام ، أو البرامج واعداداتها ، من هنا جاءت أهمية Registry وذلك لأنه يوفر مساحة توصف بأنها آمنه للمبرمج بحفظ ما يريد في السجلات الخاصة به.

بعد موضوع الأخ حميد ربيع ( التعامل مع الرجستري باستخدام فيجوال بيسك دوت نت ) والذي شرح فيه برنامجا خاص بالتعامل مع Registry يأتي هذا الموضوع في جزأين ، الأول لشرح أغلب وأهم خصائص ووضائف واجراءات التعامل مع Registry في بيئة Visual Basic .NET ، والثاني منهما هو عبارة عن مثال على شكل برنامج متكامل لأستخدام جميع الأوامر المشروحة في الجزء الأول ، ومن ثم سأقوم بوضع ملف تجميعي للدروس والأمثة الخاصة بالتعامل مع Registry ، نبدأ على مشيئة الله وتوفيقه ...

ملاحظة : الدوال المشروحة في هذا الموضوع يمكن تطبيقها على بيئات التطوير : -

Visual Basic .NET 2003
Visual Basic .NET 2005
Visual Basic .NET 2008
Visual Basic .NET 2010

سنتعامل في هذا الدرس مع التالي :

تفرع الأسماء: Namespace Microsoft.Win32
الفئة: Class Registry
الفئة: Class Registrykey

في هذا الجزء التطبيق ليس مطلوبا في الجزء الثاني سنتعامل عمليا مع هذه الدوال ، كل ما عليك الآن هو فهم طريقة عملها جيدا ...
}}}
تم الشكر بواسطة: asemshahen5
#2
في البداية فإننا نقوم بإنشاء كائن من الفئة Class Registrykey كالتالي:

كود :
Dim Key As Microsoft.Win32.[color=blue]RegistryKey[/color]

بعد ذلك سيكون كل تعاملنا مع هذا الكائن Key والذي قمنا باشتقاقه من الفئة Class Registrykey بسطر الكود السابق.

والآن الخطوة التالية هي اختيار المفتاح الرئيسي الذي نريد التعامل معه، وسنقوم باختيار هذا المفتاح من خلال الفئة Class Registry ويكون ذلك كالتالي:

كود :
Key = Microsoft.Win32.Registry.[color=blue]CurrentUser[/color]

كما ترى فإننا قمنا باختيار المفتاح الرئيسي ( HKEY_CURRENT_USER ) ولاحظ أنه في أثناء كتابتك للكود السابق يقوم محرر الكتابة بإظهار المفاتيح الرئيسية لاختيار واحدة منها.

بعد أن نختار المفتاح الرئيسي سيكون علينا تحديد ما إذا كنا سنتعامل مع هذا المفتاح الرئيسي نفسه، أو أننا سنتعامل مع مفاتيح متفرعة عن هذا المفتاح الرئيسي.

في الحالة الأولى سيكون بإمكاننا البدء باستخدام الوظائف ما بين قراءة وكتابة وحذف، وسيتم تنفيذ ذلك على المفتاح الرئيسي.

وأما في الحالة الثانية فسيكون علينا أولاً تحديد المفتاح الفرعي الذي سنتعامل معه ويكون ذلك عن طريق الوظيفة Function OpenSubKey كالتالي:

كود :
[color=blue]Function OpenSubKey[/color](name As String, writable As Boolean) As Microsoft.Win32.RegistryKey

ولاحظ أن هذه الوظيفة تقبل معاملين:

المعامل الأول: name من نوع String ونحدد فيه اسم ومسار المفتاح الفرعي الذي نريد التعامل معه.
المعامل الثاني: writable من نوع Boolean ونحدد فيه ما إذا كنا سنسمح بالقراءة من والكتابة في هذا المفتاح True ، أو أننا سنسمح بالقراءة فقط دون الكتابة False. ويمكننا تجاهل المعامل الثاني، وفي هذه الحالة سيتم التعامل مع المفتاح على أنه للقراءة فقط ReadOnly.

صيغة المثال:

كود :
Key = Key.OpenSubKey("Software", [color=blue]True[/color])

هنا اخترنا المفتاح الفرعي ( Software ) والموجود تحت المفتاح الرئيسي ( HKEY_CURRENT_USER ) تمهيداً للتعامل معه.

خصائص الفئة: (Class Registrykey )

تحتوي الفئة ( Class Registrykey ) على ثلاث خصائص هي:

الخاصية الأولى ( Name ): وتقوم بإعادة اسم المفتاح الذي يتم التعامل معه حالياً.
الخاصية الثانية ( SubKeyCount ): وتقوم بإعادة عدد المفاتيح داخل المفتاح الذي يتم التعامل معه حالياً.
الخاصية الثالثة (ValueCount ): وتقوم بإعادة عدد القيم الموجودة داخل المفتاح الذي يتم التعامل معه حالياً.

كما هو ظاهر فإن هذه الخصائص الثلاثة للقراءة فقط ( ReadOnly )، ولا يمكن الكتابة إليها.

وظائف وإجراءات الفئة: ( Class Registrykey )

تحتوي الفئة ( Class Registrykey )على وظائف وإجراءات عديدة، سنتناول فيما يلي أهمها بالشرح والتفصيل:

الوظيفة: ( CreateSubKey Function )

وتقوم هذه الوظيفة بإضافة مفتاح جديد إلى الريجستري، كالتالي:

كود :
[align=left]
Function CreateSubKey(subkey As String) As Microsoft.Win32.RegistryKey[/align]

وتقبل هذه الوظيفة معامل واحد فقط وهو: المعامل ( subkey ) من نوع (String) ونحدد فيه اسم المفتاح الجديد الذي نريد إنشائه.

ولكن أين سيتم إضافة هذا المفتاح ؟
لا أعتقد أنه بإمكانك أن تسأل هذا السؤال بعد كل التوضيح الذي ذكرناه بالأعلى.
لقد قمنا سابقاً باستخدام الوظيفة ( OpenSubKey ّ) لتحديد المفتاح الذي سنتعامل معه، ومن البديهي هنا أنه سيتم إنشاء هذا المفتاح الجديد بداخله.

صيغة المثال:

كود :
[align=left]Key.[color=blue]CreateSubKe[/color]y("vb4arab")[/align]

هنا سيتم إضافة المفتاح الفرعي (vb4arab) إلى المفتاح الذي نتعامل معه حاليا.

الإجراء: ( SetValue Sub )

ويقوم هذا الإجراء بإضافة قيمة جديدة إلى الريجستري، كالتالي:

كود :
[align=left][color=blue]Sub SetValue[/color](name As String, value As Object)[/align]

يقبل هذه الإجراء معاملين:
المعامل الأول ( name ): من نوع ( String ) ونحدد فيه اسم القيمة الجديدة التي نريد إنشائها.
المعامل الثاني ( value ): من نوع ( Object ) ونحدد فيه القيمة نفسها.

صيغة المثال:

كود :
Dim key As Microsoft.Win32.[color=blue]RegistryKey[/color]
key = Microsoft.Win32.Registry.[color=blue]CurrentUser[/color]
key = key.[color=blue]OpenSubKey[/color]("Software\Microsoft\Windows\Current Version\Run", True)
key.[color=blue]SetValue[/color]("Calc", "calc.exe")

يقوم هذا المثال بإضافة القيمة ( Calc = calc.exe ) إلى المفتاح ( HKEY_CURRENT_USER\Software\Microsoft\Windows\Curre ntVersion\Run )، ويؤدي ذلك إلى تشغيل الآلة الحاسبة عند تسجيل الدخول إلى المستخدم الحالي.ويمكن الاستفادة من هذا المثال في إمكانية وضع البرنامج الخاص بك في وضيعة ( StartUp ) بحيث يتم تشغيله مع بدء تشغيل النظام.

الوظيفة: ( GetValue Function )

وتقوم هذه الوظيفة بإعادة القيمة التي يحملها ال Value أو اسم القيمة الذي نمرره إليها، على النحو التالي:

كود :
Function [color=blue]GetValue[/color](name As String, defaultValue As Object) As Object

ومن الواضح أن هذه الوظيفة تقبل معاملين:
المعامل الأول name : من نوع String ونحدد فيه اسم القيمة التي نريد معرفة قيمتها.
المعامل الثاني defaultValue : من نوع Object ونحدد فيه قيمة افتراضية يتم إرجاعها في حال عدم وجود اسم القيمة المطلوب، ويمكننا التغاضي عن هذا المعامل وعدم ذكره.
في المثال التالي سنحاول معرفة القيمة التي يحملها مدخل قيمة موجود في المسار التالي HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control هذا المدخل اسمه SystemStartOptions وسنقوم بإعادة قيمته في مربع نص TextBox، وفي حال عدم وجود هذا المدخل فإن القيمة العائدة ستكون "notihng"

صيغة المثال:

كود :
Dim Key As Microsoft.Win32.[color=blue]RegistryKey[/color]
Key = Microsoft.Win32.Registry.[color=blue]LocalMachine[/color]
Key = Key.[color=blue]OpenSubKey[/color]("SYSTEM\ControlSet001\Control", True)
TextBox1.Text = Key.[color=blue]GetValue[/color]("[color=red]SystemStartOptions[/color]", "[color=red]nothing[/color]")

الإجراء: DeleteSubKey Sub

ويقوم هذا الإجراء بحذف مفتاح من الريجستري وحذف كل القيم التي بداخله، ولكن يشترط أن لا يحتوي هذا المفتاح على أي مفاتيح متفرعة منه؛ لأنه في هذه الحالة سيكون عليك استخدام الإجراء DeleteSubKeyTree Sub والذي سيأتي شرحه لاحقاً.

صيغة الإجراء:

كود :
[align=left]
Sub [color=blue]DeleteSubKey[/color](subkey As String, throwOnMissingSubKey As Boolean)[/align]

وكما نرى فإن هذا الإجراء يحتاج إلى تمرير معاملين:
المعامل الأول subkey : من نوع String وهو المفتاح الذي نريد حذفه.
المعامل الثاني throwOnMissingSubKey : من نوع Boolean ويكون True في حال الرغبة بإظهار رسالة خطأ عند عدم وجود المفتاح المراد حذفه، وتكون False في حال الرغبة بعدم إظهار رسالة الخطأ هذه. ملحوظة: يمكننا تجاهل المعامل الثاني تماماً وسيتم التعامل على أنه يحمل القيمة True.

صيغة المثال:

كود :
Dim Key As Microsoft.Win32.[color=blue]RegistryKey[/color]
Key = Microsoft.Win32.Registry.[color=blue]CurrentUser[/color]
Key = Key.[color=blue]OpenSubKey[/color]("Software", True)
Key.[color=blue]DeleteSubKey[/color]("[color=red]XXX[/color]", [color=red]False[/color])

ففي المثال السابق نقوم بحذف المفتاح XXX والموجود في المسار التالي HKEY_CURRENT_USER\Software طبعاً هذا المفتاح لم يكن موجوداً ولكني قمت بإنشائه سابقاً.

ملاحظة : توخى الحذر في الأوامر الخاصة بالحذف لئلا يتم حذف أي مفاتيح أو قيم مهمة للنظام .

الإجراء: DeleteSubKeyTree Sub

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

صيغة الإجراء:

كود :
Sub [color=blue]DeleteSubKeyTree[/color](subkey As String)

وهنا نجد أن الإجراء يحتاج إلى معامل واحد فقط وهو المعامل subkey من نوع String ويحتوي على المفتاح الذي نريد حذفه.

صيغة المثال:

كود :
Dim Key As Microsoft.Win32.[color=blue]RegistryKey[/color]
Key = Microsoft.Win32.Registry.[color=blue]CurrentUser[/color]
Key = Key.[color=blue]OpenSubKey[/color]("Software", True)
Key.[color=blue]DeleteSubKeyTree[/color]("[color=red]XXX[/color]")

وفي المثال السابق نقوم بحذف المفتاح XXX والموجود في المسار التالي HKEY_CURRENT_USER\Software طبعاً سيتم حذف كل المفاتيح والقيم المتفرعة عن هذا المفتاح.

ملاحظة: يمكن ايضا استخدام المعامل throwOnMissingSubKey وهو يقوم بنفس العمل مع الإجراء DeleteSubKey Sub .

الإجراء DeleteValue Sub:

ويقوم هذا الإجراء بحذف مسمى قيمة من الريجستري، مع ما تحمله من قيمة .

صيغة الإجراء:

Sub DeleteValue(name As String)

هذا الإجراء يحتاج إلى تمرير معامل واحد فقط هو name من نوع String وهو مدخل القيمة الذي نريد حذفه .

صيغة المثال:

كود :
Dim Key As Microsoft.Win32.[color=blue]RegistryKey[/color]
Key = Microsoft.Win32.Registry.[color=blue]CurrentUser[/color]
Key = Key.[color=blue]OpenSubKey[/color]("Software\XXX", True)
Key.[color=blue]DeleteValue[/color]("[color=red]Color[/color]")

في هذا المثال نقوم بحذف القيمة المسماه Color مع ما تحمله من قيمة من المسار التالي HKEY_CURRENT_USER\Software\XXX .

الوظيفة GetSubKeyNames Function:

وتقوم هذه الوظيفة بإعادة أسماء المفاتيح المتفرعة من المفتاح الذي نتعامل معه، ويتم إرجاع هذه المفاتيح الفرعية في شكل قيم نصية داخل مصفوفة، على النحو التالي:

كود :
Function [color=blue]GetSubKeyNames[/color]() As String()

وكما هو واضح فإن هذه الوظيفة لا تقبل أية معاملات وإنما هي تتعامل مع المفتاح المفتوح حالياً، وفي المثال التالي سنقوم بمعرفة المفاتيح الفرعية الموجودة في المفتاح HKEY_CURRENT_USER\Software وسنقوم بإضافة هذه المفاتيح في مربع قائمة ListBox

صيغة المثال:


كود :
Dim Key As Microsoft.Win32.[color=blue]RegistryKey[/color]
Key = Microsoft.Win32.Registry.[color=blue]CurrentUser[/color]
Key = Key.[color=blue]OpenSubKey[/color]("Software", True)
Dim [color=red]i[/color] As Byte
For i = 0 To Key.[color=blue]GetSubKeyNames[/color].Length - 1
[color=red]ListBox1[/color].Items.Add(Key.[color=blue]GetSubKeyNames[/color]([color=red]i[/color]))
Next

الوظيفة GetValueNames Function:

وتقوم هذه الوظيفة بإعادة أسماء القيم المتفرعة من المفتاح الذي نتعامل معه، ويتم إرجاع هذه القيم الفرعية في شكل قيم نصية داخل مصفوفة، على النحو التالي:

كود :
Function [color=blue]GetValueNames[/color]() As String()

وكما هو واضح فإن هذه الوظيفة لا تقبل أية معاملات وإنما هي تتعامل مع المفتاح المفتوح حالياً، وفي المثال التالي سنقوم بمعرفة القيم الفرعية الموجودة في المفتاح HKEY_CURRENT_USER\Software\Microsoft\Windows\Curre ntVersion\Run وهو المفتاح الذي يحتوي على برامج بدء التشغيل، ثم نقوم بإضافة هذه القيم في مربع قائمة ListBox.

صيغة المثال:

كود :
Dim Key As Microsoft.Win32.[color=blue]RegistryKey[/color]
Key = Microsoft.Win32.Registry.[color=blue]CurrentUser[/color]
Key = Key.[color=blue]OpenSubKey[/color]("Software\Microsoft\Windows\Current Version\Run", True)
Dim [color=red]i[/color] As [color=red]Byte[/color]
For i = 0 To Key.[color=blue]GetValueNames[/color].Length - 1
[color=red]ListBox1[/color].Items.Add(Key.[color=blue]GetValueNames[/color]([color=red]i[/color]))
Next

الإجراء Close Sub:

ويقوم هذا الإجراء بإغلاق المفتاح الذي كنا نتعامل معه والذي قمنا بفتحه سابقاً باستخدام الوظيفة OpenSubKey، وبذلك نستطيع أن نقول أن هذا الإجراء هو المقابل العكسي للوظيفة OpenSubKey، ويتم الاستفادة من هذا الإجراء كالتالي:

كود :
Sub [color=blue]Close[/color]()

وواضح جداً أن هذا الإجراء لا يقبل أية معاملات ولا يُعيد أي قيم .
وفي المثال التالي سنقوم بمحاولة إنشاء قيمة جديدة في المسار التالي HKEY_CURRENT_USER\Software ولكن المحاولة ستفشل لأننا سنقوم بإغلاق المفتاح قبل محاولة إنشاء القيمة.

صيغة المثال:

كود :
Dim Key As Microsoft.Win32.[color=blue]RegistryKey[/color]
Key = Microsoft.Win32.Registry.[color=blue]CurrentUser[/color]
Key = Key.[color=blue]OpenSubKey[/color]("Software", True)
Key.[color=blue]Close[/color]()
Key.[color=blue]SetValue[/color]("New Value", "Value")

وبالفعل فشلت المحاولة وحصلنا على رسالة الخطأ: ( Cannot access a closed registry key لا يمكن الوصول إلى المفتاح المغلق )، والتي تعني عدم إمكانية إنشاء القيمة في المسار الذي حددناه قبل فتحه.
}}}
تم الشكر بواسطة: CLARO , asemshahen5 , العواد الصغير


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  نظرة على DropBox SDK و التعامل معها +برنامج رفع و تحميل ملفات ابو ليلى 4 4,882 08-09-22, 11:54 AM
آخر رد: saif2023
  الجزء الثالث من:كيف تجعل الـ Text Box ذكي!يترجم العمليات الحسابية ويخرج الناتج (الأقواس المتعددة) !! أنس محمود 10 7,845 19-07-22, 12:15 AM
آخر رد: StartLight4000
  التعامل مع الصور Images في بيئة الدوت نت باستخدام +GDI - مقدمة RaggiTech 3 5,868 30-07-21, 05:14 PM
آخر رد: kebboud
Lightbulb [مقال] التعامل مع ملفات اوفيس من خلال مكتبة NPOI ابو ليلى 2 4,199 01-07-21, 11:42 AM
آخر رد: kebboud
Lightbulb [مقال] التعامل مع اختصارات الملفات Shortcuts Magic Sword 2 4,422 01-10-20, 11:36 AM
آخر رد: abomo3ath
  [مقال] دوال التعامل مع النصوص Strings - VB.NET ابو ليلى 10 25,155 15-04-19, 07:09 PM
آخر رد: alsouf
  إستخدام الواجهات Interface في إستدعاء الدوال و الروتينات من ملف Dll silverlight 4 4,172 22-06-18, 08:12 PM
آخر رد: sendbad100
Exclamation [VB.NET] التعامل مع ال CMD عن طريق ال TextBox YousefOkasha 5 5,024 02-06-18, 09:34 PM
آخر رد: YousefOkasha
  [درس فيديو] مثال بسيط لبرنامج إجازات فقط لأغراض الشرح (الدرس الأول) عبدالله الدوسري 7 11,547 28-04-18, 06:55 PM
آخر رد: moniam
  حساب قيمة معادلة(اقصد صيغة دون مجاهيل) مكتوبة بالتكست : الجزء الخامس والاخير محمد شريقي 4 4,522 23-02-18, 10:44 PM
آخر رد: العواد الصغير

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


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