实例说明
在本实例中,我们将制作一个能读写注册表的程序。程序运行后,可以选择要添加、删除、修改或查询的键和键值。程序运行结果如图68-1所示。
图68-1 运行结果
技术要点
l 查询键值
实现过程
■ 新建项目
打开Visual Studio.NET,选择"新建项目",在项目类型窗口中选择"Visual Basic项目",在模板窗口中选择"Windows应用程序",在名称域中输入"Rwregister",然后选择保存路径。单击"确认"。
■ 添加控件和模块
向当前窗体上添加两组Group控件,每组上有两个RadioButton选项按钮,将它们分别做成控件数组;四个Label控件,用作说明之用;一个ComboBox控件和三个TextBox控件,分别用于输入相应的子键、键名和键值;四个Button控件用于实现相应的功能。
■ 设置属性
将Label控件、Button按钮、RadioButton控件的Text属性设置为和界面一致。将TextBox控件的Text属性清空。
由于本实例使用的API函数和常数比较多,在此仅列出主要的声明部分。
Option Strict Off
Public Declare Function RegCreateKeyEx Lib "advapi32.dll" Alias "RegCreateKeyExA" (ByVal hKey As Long,ByVal lpSubKey As String,ByVal Reserved As Long,ByVal lpClass As String,ByVal dwOptions As Long,ByVal samDesired As Long,lpSecurityAttributes As Security_ATTRIBUTES,phkResult As Long,lpdwdisposition As Long) As Long
Public Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As Long,ByVal lpSubKey As String) As Long
Public Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long,ByVal lpValueName As String) As Long
Public Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Public Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long,phkResult As Long) As Long
Public Declare Function RegSetValue Lib "advapi32.dll" Alias "RegSetValueA" (ByVal hKey As Long,ByVal dwType As Long,ByVal lpData As String,ByVal cbData As Long) As Long
Public Type Security_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type
' 设置键值
Public Function Setkeyvalue(ByRef lPredefinedKey As Integer,ByRef sKeyName As String,ByRef sValueName As String,ByRef vValueSetting As Object,ByRef lValueType As Integer) As Object
Dim lRetVal As Integer
Dim hKey As Integer
lRetVal = RegOpenKeyEx(lPredefinedKey,sKeyName,KEY_ALL_ACCESS,hKey)
lRetVal = SetValueEx(hKey,sValueName,lValueType,vValueSetting)
RegCloseKey(hKey)
End Function
' 查询键值
Public Function QueryValue(ByRef lPredefinedKey As Integer,ByRef sValueName As String) As Object
Dim lRetVal As Integer
Dim hKey As Integer
Dim vValue As Object
lRetVal = RegOpenKeyEx(lPredefinedKey,hKey)
lRetVal = QueryValueEx(hKey,vValue)
QueryValue = vValue
RegCloseKey(hKey)
End Function
' 新建键
Public Function CreateNewKey(ByRef lPredefinedKey As Integer,ByRef sNewKeyName As String) As Object
Dim hNewKey As Integer
Dim lRetVal As Integer
Dim SA As Security_ATTRIBUTES
lRetVal = RegCreateKeyEx(lPredefinedKey,sNewKeyName,nothing,REG_OPTION_NON_VOLATILE,SA,hNewKey,lRetVal)
RegCloseKey(hNewKey)
End Function
' 删除键值
Public Function DeleteValue(ByRef lPredefinedKey As Integer,ByRef sValueName As String) As Object
Dim lRetVal As Integer
Dim hKey As Integer
lRetVal = RegOpenKeyEx(lPredefinedKey,hKey)
lRetVal = RegDeleteValue(hKey,sValueName)
RegCloseKey(hKey)
End Function
'删除键
Public Function DeleteKey(ByRef lPredefinedKey As Integer,ByRef sKeyName As String) As Object
Dim lRetVal As Integer
Dim hKey As Integer
lRetVal = RegOpenKeyEx(lPredefinedKey,hKey)
lRetVal = RegDeleteKey(lPredefinedKey,sKeyName)
RegCloseKey(hKey)
End Function
' 下面这些代码是在窗体中的
' 添加键和键值
Private Sub cmdadd_Click(ByVal eventSender As System.Object,ByVal eventArgs As System.EventArgs) Handles cmdadd.Click
Dim resmainkey As Integer
mainkey = VB6.GetItemString(Combo1,Combo1.Selectedindex)
resmainkey = ResultMainKey(mainkey)
' 判断操作的对象是键还是键值
If opttype(0).Checked Then
CreateNewKey(resmainkey,(Text1.Text))
Else
' 判断添加的是数值还是字符串
If numtype(0).Checked Then
Setkeyvalue(resmainkey,(Text1.Text),(Text2.Text),(Text3.Text),REG_DWORD)
Else
Setkeyvalue(resmainkey,REG_SZ)
End If
End If
End Sub
Private Sub cmddelete_Click(ByVal eventSender As System.Object,ByVal eventArgs As System.EventArgs) Handles cmddelete.Click
Dim resmainkey As Integer
mainkey = VB6.GetItemString(Combo1,Combo1.Selectedindex)
resmainkey = ResultMainKey(mainkey)
If opttype(0).Checked Then
DeleteKey(resmainkey,(Text1.Text))
Else
DeleteValue(resmainkey,(Text2.Text))
End If
End Sub
' 查询键值
Private Sub cmdquery_Click(ByVal eventSender As System.Object,ByVal eventArgs As System.EventArgs) Handles cmdquery.Click
Dim resmainkey As Integer
mainkey = VB6.GetItemString(Combo1,Combo1.Selectedindex)
resmainkey = ResultMainKey(mainkey)
Text3.Text = QueryValue(resmainkey,(Text2.Text))
End Sub
' 程序启动时的代码
Private Sub Form1_Load(ByVal eventSender As System.Object,ByVal eventArgs As System.EventArgs) Handles MyBase.Load
With Combo1
.Items.Add("HKEY_CLASSES_ROOT")
.Items.Add("HKEY_CURRENT_USER")
.Items.Add("HKEY_LOCAL_MACHINE")
.Items.Add("HKEY_USERS")
.Items.Add("HKEY_CURRENT_CONfig")
.Items.Add("HKEY_DYN_DATA")
.Selectedindex = 0
End With
End Sub
■ 运行程序
单击菜单"调试|启动"或单击 图标运行程序。
小结
通过对本实例的学习,相信读者已经掌握了关于注册表的有关操作。读者可以使用注册表保存自己的设置,将本实例与其他实例结合,可以做出更优秀的程序出来。