用VB编写程序自启动的通用模块
软件世界
Windows下的软件中常含有是否随Windows启动而启动的选项,这是通过修改注册表Run子键完成的,而这一子键是VB提供的注册表函数无法操作的。以下,我就为大家介绍使用API函数实现添加、删除自启动项目的通用模块。源代码如下:
'初始化全局变量
Option Explicit
Public mark As Integer '控制是否自启动的标志变量(1自启动,0不自启动)
'添加删除自启动项目的API函数声明
Public Const HKEY_CLASSES_ROOT = &H80000000
Public Const HKEY_CURRENT_USER = &H80000001
Public Const HKEY_LOCAL_MACHINE = &H80000002
Public Const HKEY_USERS = &H80000003
Public Const HKEY_PERFORMANCE_DATA = &H80000004
Public Const HKEY_CURRENT_CONFIG = &H80000005
Public Const HKEY_DYN_DATA = &H80000006
Public Const REG_NONE = 0
Public Const REG_SZ = 1
Public Const REG_EXPAND_SZ = 2
Public Const REG_BINARY = 3
Public Const REG_DWORD = 4
Public Const REG_DWORD_BIG_ENDIAN = 5
Public Const REG_MULTI_SZ = 7
Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Declare Function RegSetValue Lib "advapi32.dll" Alias "RegSetValueA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal dwType As Long, ByVal lpData As String, ByVal cbData As Long) As Long
Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long
Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long
'在注册表中添加删除自启动项目的模块
Sub Main()
' 定义hKey 为句柄变量、SubKey为注册表RUN项目变量、Exe为程序名变量
Dim hKey As Long, SubKey As String, Exe As String
Select Case mark
Case 1
'将程序设定成随 Windows 启动而启动
'取程序所在路径,判断是否为根目录并分别加上程序全名并赋值给变量Exe
If Right(App.Path,1) = "\" Then
Exe = App.Path + App.EXEName + ".exe" ' 根目录情况
Else: Exe = App.Path + "\" + App.EXEName + ".exe" ' 非根目录情况
End If
SubKey = "Software\Microsoft\Windows\CurrentVersion\Run" ' 设置项目
RegCreateKey HKEY_CURRENT_USER,SubKey,hKey ' 取得句柄
RegSetValueEx hKey, "MyExeName", 0, REG_SZ, ByVal Exe, _
LenB(StrConv(Exe,vbFromUnicode)) + 1 ' 写入键值
RegCloseKey hKey ' 关闭句柄
Case 0
'将程序设定成不随 Windows 启动而启动
SubKey = "Software\Microsoft\Windows\CurrentVersion\Run" ' 设置项目
RegOpenKey HKEY_CURRENT_USER, SubKey, hKey ' 取得句柄
RegDeleteValue hKey, "MyExeName" ' 删除键值
RegCloseKey hKey ' 关闭句柄
End Select
End Sub
说明:
1.使用方法是将上面代码作为一个模块添加到工程中,程序中完成是否自启动的设置后,对启动标志变量mark进行赋值,然后调用该模块(即CALL Main)。
2.模块中操作的项目为HKEY_CURRENT_USER下的Run子键,只对当前用户有效,若想对所有用户有效,请更改取得句柄语句为RegOpenKey HKEY_LOCAL_MACHINE,SubKey,hKey即可。
3.模块中的“MyExeName”为欲自启动的应用程序名,用户可根据自己的程序名修改。