ناك عدد مِنْ التقنياتِ التي تَسْمحُ للبرنامج بالتنفيذ مع بداية تشغيل الويندوز. البعض مِنْ هذه (على الأقل في رأيي) خبيث جداً. على سبيل المثال، أستخدام جسمَ TextStream في نموذجِ جسمِ FileSystemObject لكِتابَة المسلكِ واسمِ البرنامجِ في autoexec.bat. هذه التقنية وَرثتْ مِنْ أيامِDOS ؛ العديد مِنْ المستخدمين، عندما يُقرّرونَبعدم تنفيذ البرنامجَ مع البدءِ لتنفيذ الويندوز، لَيسوا على دراية بأنّهم يَجِبُ أَنْ يُدقّقوا في autoexec.bat.وهنالك بديل أسوأ يَستعملُ وظائفَ ملفِ التهيئةَ فيWin32API للكِتابَة بعد الأمر Load= أَو Run= في الملف Win.ini.
أفضل الطريقين هما registry أَوstartup folder. أي طريقة تَختارُ تَعتمدَ على كَمْ سهولة أداء المطلوب وكذلك إزالة البرنامجِ إذا قرّرت عدم تنفيذه مع بدءَ تشغيل النظامِ.
إذا ُقرّرت بأنّك تُريدُ إسْتِعْمال registry ، تَحتاجُ لإتِّخاذ القرارين الرئيسيينِ. أولاً، أنت يَجِبُ أَنْ تَختارَ مفتاحَ registry في أي منهما سَتَكْتبُ المعلوماتَ الجديدةَ. يَعتمدُ هذا القرارِ في الجزءِ الكبيرِ على شخصِ تطبيقِكَ وعلى الذي تُريدُ تنفيذه في البدءِ. الثانية، تَحتاجُ لإخْتياَر طريقة ا لكتابة إلى registry. دعنا نَنْظرُ إلى هذه القضيتين.
أنت يُمْكِنُ أَنْ تُديرَ تطبيقَ آلياً بكتابة دخول القيمةِ (يُكملُ اسماً / زوج قيمةِ) إلى أيّ مِنْ registry التاليِ يَقْفلُ (أنا سَأَستعملُ المُخْتَصَراتَ هنا للمفاتيحِ العالية المستوى):
HKCU\Software\Microsoft\Windows\CurrentVersion\Run
يستعمل هذا المفتاحِ عندما تُريدُ دائماً البرنامج ينفذ عندما يقوم المستخدم بأستخدام النظام.
HKCU\Software\Microsoft\Windows\CurrentVersion\Run Once
هذا المفتاحِ نموذجياً يستخدم من قبل برامجِ التركيبِ installation programs.
HKLM\Software\Microsoft\Windows\CurrentVersion\Run
يستعمل هذا المفتاحِ عندما تُريدُ دائماً البرنامج ينفذ عندما يقوم المستخدم بأستخدام النظام.
HKLM\Software\Microsoft\Windows\CurrentVersion\Run Once
هذا المفتاحِ نموذجياً يستخدم من قبل برامجِ التركيبِ installation programs.
في كُلّ مرة، تُحمّلُ تطبيقَكَ تبدأ بكتابة الزوج الذي يتضمن الاسم / القيمةِ إلى المفتاحِ الملائمِ. إنّ اسمَ المفتاحَ هو أسم إعتباطيُ فقط عندما تريد البحث عنه تعلم تحت أي أسم يكون، طالما هذا الأسم يكون وحيد أي لامثيل له يجب أن تتضمن القيمةَ التي تَعُودُ إلى ذلك المفتاحِ.المسلك الكاملُ واسمُ الملف أوالتطبيق المراد تنفيذه.
بشكل عادي، فقط يمكنك أضافة windows scrip host object model كمرجع reference الى البرتامج ليمكنك من أستخدام ال Shell ،وبذلك تستطيع دَعوةِ RegWrite لجسم ال Shell على النحو التالي:
oShell.RegWrite strName, Value [,strType]
حيث أنَّ oShell a إشارة إلى جسم WSH Shell والمتغيرات كالتّالي:
strName
مسلكregistry الكاملِ إلى دخولِ القيمةَ الّذي سَيُكْتَبُ.
Value
القيمة الّتي سَتُكْتَبُ إلى registry. لتنفيذ التطبيقَ عند بدءِ تشغيل الويندوز، هذا يَجِبُ أَنْ يَكُونَ المسلك الكاملَ واسمَ ملف التطبيقِ اللّذان سَيُطلَقانِ.
strType
datatype للقيمةِ. إنّ نوع بيانات القيمة الأصلية هي REG_SZ (a null-terminated string), REG_EXPAND_SZ (a string with embedded system macros),
REG_DWORD (a long integer), and REG_BINARY (binary data) ،
المثال تم أستخدام API :
تكتاج لبناء مشروعك أضافة Microsoft Common Dialog Control 6.0 الى مشروعك و TextBox لعرض المسار مع أسم الملف، ثلاثة command button واحد لأظهار Common Dialog لأحتيار التطبيق الذي تريده ينفذ مع بدء تشغيل النظام. والأخر لغرض جعل الملف ينفذ، والمفتاح الأخير لألغاء جعل الملف ينفذ.
______ ضع هذا الكود في الفورم __________
Private Sub Command1_Click()
Registery.DoStartUp txtPath.Text, "My program"
End Sub
Private Sub Command2_Click()
Registery.DoNotStartUp txtPath.Text, "My program"
End Sub
Private Sub cmdOpen_Click()
DialOpen.ShowOpen
txtPath.Text = DialOpen.Filename
End Sub
_______ ضع هذا الكود في Module ________
Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long
Private Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, ByVal lpData As String, ByVal cbData As Long) As Long
Private Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Private Const HKEY_LOCAL_MACHINE = &H80000002
Private Const REG_SZ = 1
Private Const KEY_WRITE = 131078
Public Function DoStartUp(Filename As String, Discription As String)
Dim hKey As Long
RegOpenKeyEx HKEY_LOCAL_MACHINE, "Software\Microsoft\Windows\CurrentVersion\Run-", 0, KEY_WRITE, hKey
RegDeleteValue hKey, Discription
RegCloseKey hKey
RegOpenKeyEx HKEY_LOCAL_MACHINE, "Software\Microsoft\Windows\CurrentVersion\Run ", 0, KEY_WRITE, hKey
RegSetValueEx hKey, Discription, 0, REG_SZ, Filename, Len(Filename)
RegCloseKey hKey
End Function
Public Function DoNotStartUp(Filename As String, Discription As String)
Dim hKey As Long
RegOpenKeyEx HKEY_LOCAL_MACHINE, "Software\Microsoft\Windows\CurrentVersion\Run ", 0, KEY_WRITE, hKey
RegDeleteValue hKey, Discription
RegCloseKey hKey
RegOpenKeyEx HKEY_LOCAL_MACHINE, "Software\Microsoft\Windows\CurrentVersion\Run-", 0, KEY_WRITE, hKey
RegSetValueEx hKey, Discription, 0, REG_SZ, Filename, Len(Filename)
RegCloseKey hKey
End Function