📄 register.bas
字号:
Attribute VB_Name = "Bas"
Option Explicit
Public Const NIM_ADD = &H0
Public Const NIM_DELETE = &H2
Public Const WM_MOUSEMOVE = &H200
Public Const NIF_MESSAGE = &H1
Public Const NIF_TIP = &H4
Public Const REG_ERROR = "REGISTRY_ERROR"
Public Const NIM_MODIFY = &H1
Public Const NIF_ICON = &H2
Public Const WM_LBUTTONDOWN As Long = &H201
Public Const WM_LBUTTONUP As Long = &H202
Public Const WM_LBUTTONDBLCLK As Long = &H203
Public Const WM_MBUTTONDOWN As Long = &H207
Public Const WM_MBUTTONUP As Long = &H208
Public Const WM_MBUTTONDBLCLK As Long = &H209
Public Const WM_RBUTTONDOWN As Long = &H204
Public Const WM_RBUTTONUP As Long = &H205
Public Const WM_RBUTTONDBLCLK As Long = &H206
Type FILETIME
lLowDateTime As Long
lHighDateTime As Long
End Type
Public Type NOTIFYICONDATA
cbSize As Long
hwnd As Long
uID As Long
uFlags As Long
uCallbackMessage As Long
hIcon As Long
szTip As String * 64
End Type
Public T As NOTIFYICONDATA
Declare Function RegOpenKeyEx& Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey&, ByVal lpszSubKey$, dwOptions&, ByVal samDesired&, lpHKey&)
Declare Function RegCreateKey& Lib "advapi32" Alias "RegCreateKeyA" (ByVal hKey&, ByVal lpszSubKey$, phkResult&)
Declare Function RegCreateKeyEx& Lib "advapi32.dll" Alias "RegCreateKeyExA" (ByVal hKey&, ByVal lpSubKey$, ByVal Reserved&, ByVal lpClass$, ByVal dwOptions&, ByVal samDesired&, lpSecurityAttributes&, phkResult&, lpdwDisposition&)
Declare Function RegDeleteKey& Lib "advapi32" Alias "RegDeleteKeyA" (ByVal hKey As Long, ByVal lpszSubKey As String)
Declare Function RegCloseKey& Lib "advapi32.dll" (ByVal hKey&)
Declare Function RegQueryValueEx& Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey&, ByVal lpszValueName$, ByVal lpdwRes&, lpdwType&, ByVal lpDataBuff$, nSize&)
Declare Function RegSetValueEx& Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey&, ByVal lpszValueName$, ByVal dwRes&, ByVal dwType&, lpDataBuff As Any, ByVal nSize&)
Declare Function RegConnectRegistry& Lib "advapi32.dll" (ByVal lpMachineName$, ByVal hKey&, phkResult&)
Declare Function RegFlushKey& Lib "advapi32.dll" (ByVal hKey&)
Declare Function RegEnumKeyEx& Lib "advapi32.dll" Alias "RegEnumKeyExA" (ByVal hKey&, ByVal dwIndex&, ByVal lpName$, lpcbName&, ByVal lpReserved&, ByVal lpClass$, lpcbClass&, lpftLastWriteTime As FILETIME)
Declare Function RegEnumValue& Lib "advapi32.dll" Alias "RegEnumValueA" (ByVal hKey&, ByVal dwIndex&, ByVal lpName$, lpcbName&, ByVal lpReserved&, lpdwType&, lpValue As Any, lpcbValue&)
Declare Function RegQueryInfoKey& Lib "advapi32.dll" Alias "RegQueryInfoKeyA" (ByVal hKey&, ByVal lpClass$, lpcbClass&, ByVal lpReserved&, lpcSubKeys&, lpcbMaxSubKeyLen&, lpcbMaxClassLen&, lpcValues&, lpcbMaxValueNameLen&, lpcbMaxValueLen&, lpcbSecurityDescriptor&, lpftLastWriteTime As FILETIME)
Declare Function Shell_NotifyIcon Lib "shell32" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, pnid As NOTIFYICONDATA) As Boolean
Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long
Const ERROR_SUCCESS = 0&
Const ERROR_BADDB = 1009&
Const ERROR_BADKEY = 1010&
Const ERROR_CANTOPEN = 1011&
Const ERROR_CANTREAD = 1012&
Const ERROR_CANTWRITE = 1013&
Const ERROR_OUTOFMEMORY = 14&
Const ERROR_INVALID_PARAMETER = 87&
Const ERROR_ACCESS_DENIED = 5&
Const ERROR_NO_MORE_ITEMS = 259&
Const ERROR_MORE_DATA = 234&
Const REG_NONE = 0&
Const REG_SZ = 1&
Const REG_EXPAND_SZ = 2&
Const REG_BINARY = 3&
Const REG_DWORD = 4&
Const REG_DWORD_LITTLE_ENDIAN = 4&
Const REG_DWORD_BIG_ENDIAN = 5&
Const REG_LINK = 6&
Const REG_MULTI_SZ = 7&
Const REG_RESOURCE_LIST = 8&
Const REG_FULL_RESOURCE_DESCRIPTOR = 9&
Const REG_RESOURCE_REQUIREMENTS_LIST = 10&
Const KEY_QUERY_VALUE = &H1&
Const KEY_SET_VALUE = &H2&
Const KEY_CREATE_SUB_KEY = &H4&
Const KEY_ENUMERATE_SUB_KEYS = &H8&
Const KEY_NOTIFY = &H10&
Const KEY_CREATE_LINK = &H20&
Const READ_CONTROL = &H20000
Const WRITE_DAC = &H40000
Const WRITE_OWNER = &H80000
Const SYNCHRONIZE = &H100000
Const STANDARD_RIGHTS_REQUIRED = &HF0000
Const STANDARD_RIGHTS_READ = READ_CONTROL
Const STANDARD_RIGHTS_WRITE = READ_CONTROL
Const STANDARD_RIGHTS_EXECUTE = READ_CONTROL
Const KEY_READ = STANDARD_RIGHTS_READ Or KEY_QUERY_VALUE Or _
KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY
Const KEY_WRITE = STANDARD_RIGHTS_WRITE Or KEY_SET_VALUE Or _
KEY_CREATE_SUB_KEY
Const KEY_EXECUTE = KEY_READ
Public gbSkipRegErrMsg As Boolean
Public Const DRIVE_CDROM = 5
Public NotifyTrue As Boolean, PlayTrue As Boolean
Public Function DeleteRegKey(sKeyName As String) As Boolean
Dim hKey As Long, lRtn As Long
Dim lMainKeyHandle As Long
DeleteRegKey = False
Call ParseKey(sKeyName, lMainKeyHandle)
If lMainKeyHandle Then
lRtn = RegOpenKeyEx(lMainKeyHandle, sKeyName, 0&, KEY_WRITE, hKey)
If lRtn = ERROR_SUCCESS Then
lRtn = RegDeleteKey(hKey, sKeyName)
lRtn = RegCloseKey(hKey)
DeleteRegKey = True
End If
End If
gbSkipRegErrMsg = False
End Function
Private Function GetMainKeyHandle(sMainKeyName As String) As Long
'系统注册表主键的常量列表
Const HKEY_CLASSES_ROOT = &H80000000
Const HKEY_CURRENT_USER = &H80000001
Const HKEY_LOCAL_MACHINE = &H80000002
Const HKEY_USERS = &H80000003
Const HKEY_PERFORMANCE_DATA = &H80000004
Const HKEY_CURRENT_CONFIG = &H80000005
Const HKEY_DYN_DATA = &H80000006
Select Case sMainKeyName
Case "HKEY_CLASSES_ROOT"
GetMainKeyHandle = HKEY_CLASSES_ROOT
Case "HKEY_CURRENT_USER"
GetMainKeyHandle = HKEY_CURRENT_USER
Case "HKEY_LOCAL_MACHINE"
GetMainKeyHandle = HKEY_LOCAL_MACHINE
Case "HKEY_USERS"
GetMainKeyHandle = HKEY_USERS
Case "HKEY_PERFORMANCE_DATA"
GetMainKeyHandle = HKEY_PERFORMANCE_DATA
Case "HKEY_CURRENT_CONFIG"
GetMainKeyHandle = HKEY_CURRENT_CONFIG
Case "HKEY_DYN_DATA"
GetMainKeyHandle = HKEY_DYN_DATA
End Select
End Function
Private Function GetRegError(lErrorCode As Long) As String
'注册错误
Select Case lErrorCode
Case 1009, 1015
GetRegError = "注册表数据据损坏! "
Case 2, 1010
GetRegError = "注册键员损坏! "
Case 1011
GetRegError = "不能打开键! "
Case 4, 1012
GetRegError = "不能阅读键! "
Case 5
GetRegError = "访问键时被拒绝! "
Case 1013
GetRegError = "不能写键! "
Case 8, 14
GetRegError = "内存溢出! "
Case 87
GetRegError = "无效的参数! "
Case 234
GetRegError = "比缓冲区更多的数据需要保留! "
Case Else
GetRegError = "未定义的错误代码: " & Str$(lErrorCode)
End Select
End Function
Private Sub ParseKey(sKeyName As String, lKeyHandle As Long)
Dim nBackSlash As Integer
nBackSlash = InStr(sKeyName, "\")
'分析主键与子键
If Left(sKeyName, 5) <> "HKEY_" Or Right(sKeyName, 1) = "\" Then
MsgBox "注册键格式错误 !!! " & vbCrLf & vbCrLf & sKeyName, vbOKOnly + vbQuestion, "格式错误"
Exit Sub
End If
If nBackSlash = 0 Then
lKeyHandle = GetMainKeyHandle(sKeyName)
sKeyName = ""
Else
lKeyHandle = GetMainKeyHandle(Left(sKeyName, nBackSlash - 1))
sKeyName = Right(sKeyName, Len(sKeyName) - nBackSlash)
End If
If lKeyHandle < &H80000000 Or lKeyHandle > &H80000006 Then
MsgBox " 无效的主键句柄 ! ", vbOKOnly + vbExclamation, "句柄错误"
End If
End Sub
Public Function GetRegStringValue(sSubKey As String, sEntry As String) As String
Dim hKey As Long, lMainKeyHandle As Long
Dim lRtn As Long, sBuffer As String
Dim lBufferSize As Long, lType As Long
Dim sErrMsg As String
lType = REG_SZ
GetRegStringValue = REG_ERROR
Call ParseKey(sSubKey, lMainKeyHandle)
If lMainKeyHandle Then
lRtn = RegOpenKeyEx(lMainKeyHandle, sSubKey, 0&, KEY_READ, hKey)
If lRtn = ERROR_SUCCESS Then
'请求键值
sBuffer = Space(255)
lBufferSize = Len(sBuffer)
lRtn = RegQueryValueEx(hKey, sEntry, 0&, lType, sBuffer, lBufferSize)
If lRtn = ERROR_SUCCESS Then
lRtn = RegCloseKey(hKey)
'除去后面的空串
sBuffer = Trim(sBuffer)
GetRegStringValue = Left(sBuffer, Len(sBuffer) - 1)
Else
If gbSkipRegErrMsg = False Then
sErrMsg = GetRegError(lRtn)
MsgBox sErrMsg + " ", vbCritical, "请求注册键值错误!"
End If
End If
Else
If Not gbSkipRegErrMsg Then
sErrMsg = GetRegError(lRtn)
MsgBox sErrMsg, vbCritical, "注册键打开错误!"
End If
End If
End If
gbSkipRegErrMsg = False
End Function
Public Function WriteRegStringValue(sSubKey As String, sEntry As String, sValue As String) As Boolean
Dim hKey As Long, lMainKeyHandle As Long
Dim lRtn As Long, lDataSize As Long
Dim lType As Long, sErrMsg As String
WriteRegStringValue = False
lType = REG_SZ
Call ParseKey(sSubKey, lMainKeyHandle)
If lMainKeyHandle Then
'打开注册键
lRtn = RegOpenKeyEx(lMainKeyHandle, sSubKey, 0&, KEY_WRITE, hKey)
If lRtn = ERROR_SUCCESS Then
'写键值
lDataSize = Len(sValue)
lRtn = RegSetValueEx(hKey, sEntry, 0&, lType, ByVal sValue, lDataSize)
If lRtn = ERROR_SUCCESS Then
WriteRegStringValue = True
Else
If Not gbSkipRegErrMsg Then
sErrMsg = GetRegError(lRtn)
MsgBox sErrMsg, vbCritical, "写注册键值时错误"
End If
End If
lRtn = RegCloseKey(hKey)
Else
If Not gbSkipRegErrMsg Then
sErrMsg = GetRegError(lRtn)
MsgBox sErrMsg, vbCritical, "注册键打开错误"
End If
End If
End If
gbSkipRegErrMsg = False
End Function
Public Function CreateRegKey(sSubKey As String) As Boolean
Dim lMainKeyHandle As Long, hKey As Long
Dim sErrMsg As String, lRtn As Long
CreateRegKey = False
Call ParseKey(sSubKey, lMainKeyHandle)
'建立子键
If lMainKeyHandle Then
lRtn = RegCreateKey(lMainKeyHandle, sSubKey, hKey)
If lRtn = ERROR_SUCCESS Then
'建立完成,关闭
lRtn = RegCloseKey(hKey)
CreateRegKey = True
Else
If Not gbSkipRegErrMsg Then
sErrMsg = GetRegError(lRtn)
MsgBox sErrMsg, vbCritical, "建立子键错误"
End If
End If
End If
gbSkipRegErrMsg = False
End Function
Public Function FirstCDDrive() As String
Const ASC_A = 65
Const ASC_Z = ASC_A + 25
Dim i As Integer
For i = ASC_A To ASC_Z
If GetDriveType(Chr$(i) & ":\") = DRIVE_CDROM Then
FirstCDDrive = Chr$(i)
Exit For
End If
Next i
End Function
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -