شاطر
اذهب الى الأسفل
عدد المساهمات : 134
تاريخ التسجيل : 08/10/2012
معاينة صفحة البيانات الشخصي للعضو

التعامل مع الرجسترى 2

في الأحد نوفمبر 11, 2012 7:29 pm
السلام عليكم


التعامل مع الريجستري في يبيئة الفيجول بيسيك دوت نت vb.net




التجميع Assembly mscorlib
--->>> تفرع الأسماء Namespace Microsoft.Win32
------>>>>>> الفئة Class Registry
------>>>>>> الفئة Class Registrykey



في البداية فإننا نقوم بإنشاء كائن من الفئة Class Registrykey كالتالي:
الكود:

Dim Key As Microsoft.Win32.RegistryKey


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

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

key = Microsoft.Win32.Registry.CurrentUser


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

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

Function OpenSubKey(name As String, writable As Boolean) As Microsoft.Win32.RegistryKey
ولاحظ أن هذه الوظيفة تقبل معاملين:
الأول name من نوع String ونحدد فيه اسم ومسار المفتاح الفرعي الذي نريد التعامل معه.
والثاني writable من نوع Boolean ونحدد فيه ما إذا كنا سنسمح بالقراءة من والكتابة في هذا المفتاح True، أو أننا سنسمح بالقراءة فقط دون الكتابة False.
ويمكننا تجاهل المعامل الثاني، وفي هذه الحالة سيتم التعامل مع المفتاح على أنه للقراءة فقط ReadOnly.

مثال:
الكود:

Key = Key.OpenSubKey("Software", True)


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


خصائص الفئة Class Registrykey:
تحتوي الفئة Class Registrykey على ثلاث خصائص هي:
Name وتقوم بإعادة اسم المفتاح الذي يتم التعامل معه حالياً.
SubKeyCount وتقوم بإعادة عدد المفاتيح داخل المفتاح الذي يتم التعامل معه حالياً.
ValueCount وتقوم بإعادة عدد القيم الموجودة داخل المفتاح الذي يتم التعامل معه حالياً.
كما هو ظاهر فإن هذه الخصائص الثلاثة للقراءة فقط ReadOnly، ولا يمكن الكتابة إليها.


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

الوظيفة CreateSubKey Function:
وتقوم هذه الوظيفة بإضافة مفتاح جديد إلى الريجستري، كالتالي:
Function CreateSubKey(ByVal subkey As String) As Microsoft.Win32.RegistryKey
وتقبل هذه الوظيفة معامل واحد فقط وهو:
المعامل name من نوع String ونحدد فيه اسم المفتاح الجديد الذي نريد إنشائه.

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

مثال:

الكود:

key.CreateSubKey("MYPROGRAM")


هنا سيتم إضافة المفتاح الفرعي MYPROGRAM إلى المفتاح الذي نتعامل معه حالياً ..


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

مثال:
الكود:

Dim key As Microsoft.Win32.RegistryKey
key = Microsoft.Win32.Registry.CurrentUser
key = key.OpenSubKey("Software\Microsoft\Windows\Current Version\Run", True)
key.SetValue("Calc", "calc.exe")


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


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

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

مثال:

الكود:

Dim Key As Microsoft.Win32.RegistryKey
Key = Microsoft.Win32.Registry.LocalMachine
Key = Key.OpenSubKey("SYSTEM\ControlSet001\Control", True)
''''Box1.'''' = Key.GetValue("SystemStartOptions", "nothing")


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

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

مثال:

الكود:

Dim Key As Microsoft.Win32.RegistryKey
Key = Microsoft.Win32.Registry.CurrentUser
Key = Key.OpenSubKey("Software", True)
Key.DeleteSubKey("XXX", False)


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


الإجراء DeleteSubKeyTree Sub:
ويقوم هذا الإجراء بحذف مفتاح من الريجستري وحذف كل القيم التي بداخله وكذلك حذف كل المفاتيح المتفرعة منه، ويجب التأكد قبل استخدام هذا الإجراء لأنه من الممكن أن يؤدي إلى حذف مفاتيح مهمة من الريجستري عن طريق الخطأ ..
صيغة الإجراء:
Sub DeleteSubKeyTree(ByVal subkey As String)
وهنا نجد أن الإجراء يحتاج إلى معامل واحد فقط وهو المعامل subkey من نوع String ويحتوي على المفتاح الذي نريد حذفه.

مثال:
الكود:

Dim Key As Microsoft.Win32.RegistryKey
Key = Microsoft.Win32.Registry.CurrentUser
Key = Key.OpenSubKey("Software", True)
Key.DeleteSubKeyTree("XXX")


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


الإجراء DeleteValue Sub:
ويقوم هذا الإجراء بحذف مسمى قيمة من الريجستري، مع ما تحمله من قيمة ..
صيغة الإجراء:
Sub DeleteValue(ByVal name As String)
هذا الإجراء يحتاج إلى تمرير معامل واحد فقط هو name من نوع String وهو مدخل القيمة الذي نريد حذفه .

مثال:

الكود:

Dim Key As Microsoft.Win32.RegistryKey
Key = Microsoft.Win32.Registry.CurrentUser
Key = Key.OpenSubKey("Software\XXX", True)
Key.DeleteValue("Color")


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


الوظيفة GetSubKeyNames Function:
وتقوم هذه الوظيفة بإعادة أسماء المفاتيح المتفرعة من المفتاح الذي نتعامل معه، ويتم إرجاع هذه المفاتيح الفرعية في شكل قيم نصية داخل مصفوفة، على النحو التالي:
Function GetSubKeyNames() As String()
وكما هو واضح فإن هذه الوظيفة لا تقبل أية معاملات وإنما هي تتعامل مع المفتاح المفتوح حالياً، وفي المثال التالي سنقوم بمعرفة المفاتيح الفرعية الموجودة في المفتاح HKEY_CURRENT_USER\Software وسنقوم بإضافة هذه المفاتيح في مربع قائمة ListBox:

مثال:
الكود:

Dim Key As Microsoft.Win32.RegistryKey
Key = Microsoft.Win32.Registry.CurrentUser
Key = Key.OpenSubKey("Software", True)
Dim i As Byte
For i = 0 To Key.GetSubKeyNames.Length - 1
ListBox1.Items.Add(Key.GetSubKeyNames(i))
Next


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

مثال:

الكود:

Dim Key As Microsoft.Win32.RegistryKey
Key = Microsoft.Win32.Registry.CurrentUser
Key = Key.OpenSubKey("Software\Microsoft\Windows\Current Version\Run", True)
Dim i As Byte
For i = 0 To Key.GetValueNames.Length - 1
ListBox1.Items.Add(Key.GetValueNames(i))
Next


الإجراء Close Sub:
ويقوم هذا الإجراء بإغلاق المفتاح الذي كنا نتعامل معه والذي قمنا بفتحه سابقاً باستخدام الوظيفة OpenSubKey، وبذلك نستطيع أن نقول أن هذا الإجراء هو المقابل العكسي للوظيفة OpenSubKey، ويتم الاستفادة من هذا الإجراء كالتالي:
Sub Close()
وواضح جداً أن هذا الإجراء لا يقبل أية معاملات ولا يُعيد أي قيم ..
وفي المثال التالي سنقوم بمحاولة إنشاء قيمة جديدة في المسار التالي HKEY_CURRENT_USER\Software ولكن المحاولة ستفشل لأننا سنقوم بإغلاق المفتاح قبل محاولة إنشاء القيمة ..

مثال:

الكود:

Dim Key As Microsoft.Win32.RegistryKey
Key = Microsoft.Win32.Registry.CurrentUser
Key = Key.OpenSubKey("Software", True)
Key.Close()
Key.SetValue("New Value", "Value")


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


الرجوع الى أعلى الصفحة
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى