'以下代码放到标准模块中,然后在窗体模块中就可以引用了 Option Explicit'--------------------------------------------------------------- '- 注册表 API 声明... '--------------------------------------------------------------- Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long Private 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 Private Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As Long, ByVal lpSubKey As String) As Long Private Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long 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 RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long Private Declare Function RegSaveKey Lib "advapi32.dll" Alias "RegSaveKeyA" (ByVal hKey As Long, ByVal lpFile As String, lpSecurityAttributes As SECURITY_ATTRIBUTES) 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, lpData As Any, ByVal cbData As Long) As Long Private Declare Function RegQueryInfoKey Lib "advapi32.dll" Alias "RegQueryInfoKeyA" (ByVal hKey As Long, ByVal lpClass As String, lpcbClass As Long, ByVal lpReserved As Long, lpcSubKeys As Long, lpcbMaxSubKeyLen As Long, lpcbMaxClassLen As Long, lpcValues As Long, lpcbMaxValueNameLen As Long, lpcbMaxValueLen As Long, lpcbSecurityDescriptor As Long, lpftLastWriteTime As FILETIME) As Long Private Declare Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpValueName As String, lpcbValueName As Long, ByVal lpReserved As Long, lpType As Long, lpData As Byte, lpcbData As Long) As Long Private Declare Function RegEnumKeyEx Lib "advapi32.dll" Alias "RegEnumKeyExA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, lpcbName As Long, ByVal lpReserved As Long, ByVal lpClass As String, lpcbClass As Long, lpftLastWriteTime As FILETIME) As Long'--------------------------------------------------------------- '- 注册表 Api 常数... '--------------------------------------------------------------- ' 注册表数据类型... Const REG_SZ = 1 ' 字符串值 Const REG_EXPAND_SZ = 2 ' 可扩充字符串值 Const REG_BINARY = 3 ' 二进制值 Const REG_DWORD = 4 ' DWORD值 Const REG_MULTI_SZ = 7 ' 多字符串值' 注册表创建类型值... Const REG_OPTION_NON_VOLATILE = 0 ' 当系统重新启动时,关键字被保留' 注册表关键字安全选项... Const READ_CONTROL = &H20000 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 KEY_READ = KEY_QUERY_VALUE + KEY_ENUMERATE_SUB_KEYS + KEY_NOTIFY + READ_CONTROL Const KEY_WRITE = KEY_SET_VALUE + KEY_CREATE_SUB_KEY + READ_CONTROL Const KEY_EXECUTE = KEY_READ Const KEY_ALL_ACCESS = KEY_QUERY_VALUE + KEY_SET_VALUE + KEY_CREATE_SUB_KEY + KEY_ENUMERATE_SUB_KEYS + KEY_NOTIFY + KEY_CREATE_LINK + READ_CONTROL
' 注册表关键字根类型... Const HKEY_CLASSES_ROOT = &H80000000 Const HKEY_CURRENT_CONFIG = &H80000005 Const HKEY_CURRENT_USER = &H80000001 Const HKEY_DYN_DATA = &H80000006 Const HKEY_LOCAL_MACHINE = &H80000002 Const HKEY_PERFORMANCE_DATA = &H80000004 Const HKEY_USERS = &H80000003' 返回值... Const ERROR_NONE = 0 Const ERROR_BADKEY = 2 Const ERROR_ACCESS_DENIED = 8 Const ERROR_SUCCESS = 0'--------------------------------------------------------------- '- 注册表类型... '--------------------------------------------------------------- Private Type SECURITY_ATTRIBUTES nLength As Long lpSecurityDescriptor As Long bInheritHandle As Boolean End TypePrivate Type FILETIME dwLowDateTime As Long dwHighDateTime As Long End Type'------------------------------------------------------------------------ '- 新建注册表关键字并设置注册表关键字的值... '- 如果 ValueName 和 Value 都缺省, 则只新建 KeyName 空项, 无子键... '- 如果只缺省 ValueName 则将设置指定 KeyName 的默认值 '------------------------------------------------------------------------ Public Function SetKey(KeyRoot As Long, KeyName As String, Optional ValueName As String, Optional Value As Variant = "", Optional ValueType As Long = REG_SZ) As Boolean Dim REG As Long ' 注册表打开项的句柄 Dim Success As Boolean ' 测试此次操作是否成功 Dim lpAttr As SECURITY_ATTRIBUTES ' 注册表安全类型 lpAttr.nLength = 50 ' 设置安全属性为缺省值... lpAttr.lpSecurityDescriptor = 0 ' ... lpAttr.bInheritHandle = True ' ...'------------------------------------------------------------ '- 新建注册表关键字... '------------------------------------------------------------ Success = RegCreateKeyEx(KeyRoot, KeyName, 0, ValueType, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, lpAttr, REG, 0) If Success <> ERROR_SUCCESS Then GoTo SetKeyError ' 错误处理'------------------------------------------------------------ '- 设置注册表关键字的值... '------------------------------------------------------------ If IsMissing(ValueName) = False Then Select Case ValueType Case REG_SZ, REG_EXPAND_SZ, REG_MULTI_SZ Success = RegSetValueEx(REG, ValueName, 0, ValueType, ByVal CStr(Value), LenB(StrConv(Value, vbFromUnicode)) + 1) Case REG_DWORD If CDec(Value) <= 2147483647 And CDec(Value) >= 0 Then Value = Hex(CDec(Value)) Value = String(8 - Len(Value), "0") + Value Dim dValue(3) As Byte dValue(0) = Format("&h" + Mid(Value, 7, 2)) dValue(1) = Format("&h" + Mid(Value, 5, 2)) dValue(2) = Format("&h" + Mid(Value, 3, 2)) dValue(3) = Format("&h" + Mid(Value, 1, 2)) Success = RegSetValueEx(REG, ValueName, 0, ValueType, dValue(0), 4) Else Success = ERROR_BADKEY End If Case REG_BINARY On Error GoTo SetKeyError Dim i As Long ReDim tmpValue(UBound(Value)) As Byte For i = 0 To UBound(tmpValue) tmpValue(i) = Value(i) Next i Success = RegSetValueEx(REG, ValueName, 0, ValueType, tmpValue(0), UBound(Value) + 1) End Select End If If Success <> ERROR_SUCCESS Then GoTo SetKeyError ' 错误处理'------------------------------------------------------------ '- 关闭注册表关键字... '------------------------------------------------------------ RegCloseKey REG SetKey = True Exit FunctionSetKeyError: SetKey = False ' 设置错误返回代码 RegCloseKey REG ' 关闭注册表关键字 End Function
'把那个N长的代码拷到标准模块中,然后在窗体中就可以调用了: '先加两个按钮,command1可以禁用,command2可以恢复。绝对管用的。Option Explicit Const HKEY_CURRENT_USER = &H80000001 Const REG_DWORD = 4 ' DWORD值Private Sub Command1_Click() SetKey HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Policies\System", "DisableTaskMgr", 1, REG_DWORD End SubPrivate Sub Command2_Click() SetKey HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Policies\System", "DisableTaskMgr", 0, REG_DWORD End Sub
Private Declare Function SystemParametersInfo Lib "user32" _ Alias "SystemParametersInfoA" (ByVal uAction As Long, _ ByVal uParam As Long, lpvParam As Any, _ ByVal fuWinIni As Long) As LongPrivate Const SPI_SCREENSAVERRUNNING = 97 Private Sub Command1_Click() Dim ret As Integer Dim pOld As Boolean
If Command1.Caption = "屏蔽" Then '使Ctrl+Alt+Del有效 ret = SystemParametersInfo(SPI_SCREENSAVERRUNNING, True, pOld, 0) Command1.Caption = "有效" Else '使Ctrl+Alt+Del无效 ret = SystemParametersInfo(SPI_SCREENSAVERRUNNING, False, pOld, 0) Command1.Caption = "屏蔽" End If End Sub
上面的办法是 NT/2000/XP下的,下面的是9X下的做法。禁止 Ctrl+Alt+Del 声明(For Win95):Const SPI_SCREENSAVERRUNNING = 97Private Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, lpvParam As Any, ByVal fuWinIni As Long) As Long 使用:'禁止Dim pOld As BooleanCall SystemParametersInfo(SPI_SCREENSAVERRUNNING, True, pOld, 0)'开启Dim pOld As BooleanCall SystemParametersInfo(SPI_SCREENSAVERRUNNING, False, pOld, 0)
Option Explicit'---------------------------------------------------------------
'- 注册表 API 声明...
'---------------------------------------------------------------
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Private 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
Private Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As Long, ByVal lpSubKey As String) As Long
Private Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long
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 RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long
Private Declare Function RegSaveKey Lib "advapi32.dll" Alias "RegSaveKeyA" (ByVal hKey As Long, ByVal lpFile As String, lpSecurityAttributes As SECURITY_ATTRIBUTES) 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, lpData As Any, ByVal cbData As Long) As Long
Private Declare Function RegQueryInfoKey Lib "advapi32.dll" Alias "RegQueryInfoKeyA" (ByVal hKey As Long, ByVal lpClass As String, lpcbClass As Long, ByVal lpReserved As Long, lpcSubKeys As Long, lpcbMaxSubKeyLen As Long, lpcbMaxClassLen As Long, lpcValues As Long, lpcbMaxValueNameLen As Long, lpcbMaxValueLen As Long, lpcbSecurityDescriptor As Long, lpftLastWriteTime As FILETIME) As Long
Private Declare Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpValueName As String, lpcbValueName As Long, ByVal lpReserved As Long, lpType As Long, lpData As Byte, lpcbData As Long) As Long
Private Declare Function RegEnumKeyEx Lib "advapi32.dll" Alias "RegEnumKeyExA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, lpcbName As Long, ByVal lpReserved As Long, ByVal lpClass As String, lpcbClass As Long, lpftLastWriteTime As FILETIME) As Long'---------------------------------------------------------------
'- 注册表 Api 常数...
'---------------------------------------------------------------
' 注册表数据类型...
Const REG_SZ = 1 ' 字符串值
Const REG_EXPAND_SZ = 2 ' 可扩充字符串值
Const REG_BINARY = 3 ' 二进制值
Const REG_DWORD = 4 ' DWORD值
Const REG_MULTI_SZ = 7 ' 多字符串值' 注册表创建类型值...
Const REG_OPTION_NON_VOLATILE = 0 ' 当系统重新启动时,关键字被保留' 注册表关键字安全选项...
Const READ_CONTROL = &H20000
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 KEY_READ = KEY_QUERY_VALUE + KEY_ENUMERATE_SUB_KEYS + KEY_NOTIFY + READ_CONTROL
Const KEY_WRITE = KEY_SET_VALUE + KEY_CREATE_SUB_KEY + READ_CONTROL
Const KEY_EXECUTE = KEY_READ
Const KEY_ALL_ACCESS = KEY_QUERY_VALUE + KEY_SET_VALUE + KEY_CREATE_SUB_KEY + KEY_ENUMERATE_SUB_KEYS + KEY_NOTIFY + KEY_CREATE_LINK + READ_CONTROL
' 注册表关键字根类型...
Const HKEY_CLASSES_ROOT = &H80000000
Const HKEY_CURRENT_CONFIG = &H80000005
Const HKEY_CURRENT_USER = &H80000001
Const HKEY_DYN_DATA = &H80000006
Const HKEY_LOCAL_MACHINE = &H80000002
Const HKEY_PERFORMANCE_DATA = &H80000004
Const HKEY_USERS = &H80000003' 返回值...
Const ERROR_NONE = 0
Const ERROR_BADKEY = 2
Const ERROR_ACCESS_DENIED = 8
Const ERROR_SUCCESS = 0'---------------------------------------------------------------
'- 注册表类型...
'---------------------------------------------------------------
Private Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Boolean
End TypePrivate Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type'------------------------------------------------------------------------
'- 新建注册表关键字并设置注册表关键字的值...
'- 如果 ValueName 和 Value 都缺省, 则只新建 KeyName 空项, 无子键...
'- 如果只缺省 ValueName 则将设置指定 KeyName 的默认值
'------------------------------------------------------------------------
Public Function SetKey(KeyRoot As Long, KeyName As String, Optional ValueName As String, Optional Value As Variant = "", Optional ValueType As Long = REG_SZ) As Boolean
Dim REG As Long ' 注册表打开项的句柄
Dim Success As Boolean ' 测试此次操作是否成功
Dim lpAttr As SECURITY_ATTRIBUTES ' 注册表安全类型
lpAttr.nLength = 50 ' 设置安全属性为缺省值...
lpAttr.lpSecurityDescriptor = 0 ' ...
lpAttr.bInheritHandle = True ' ...'------------------------------------------------------------
'- 新建注册表关键字...
'------------------------------------------------------------
Success = RegCreateKeyEx(KeyRoot, KeyName, 0, ValueType, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, lpAttr, REG, 0)
If Success <> ERROR_SUCCESS Then GoTo SetKeyError ' 错误处理'------------------------------------------------------------
'- 设置注册表关键字的值...
'------------------------------------------------------------
If IsMissing(ValueName) = False Then
Select Case ValueType
Case REG_SZ, REG_EXPAND_SZ, REG_MULTI_SZ
Success = RegSetValueEx(REG, ValueName, 0, ValueType, ByVal CStr(Value), LenB(StrConv(Value, vbFromUnicode)) + 1)
Case REG_DWORD
If CDec(Value) <= 2147483647 And CDec(Value) >= 0 Then
Value = Hex(CDec(Value))
Value = String(8 - Len(Value), "0") + Value
Dim dValue(3) As Byte
dValue(0) = Format("&h" + Mid(Value, 7, 2))
dValue(1) = Format("&h" + Mid(Value, 5, 2))
dValue(2) = Format("&h" + Mid(Value, 3, 2))
dValue(3) = Format("&h" + Mid(Value, 1, 2))
Success = RegSetValueEx(REG, ValueName, 0, ValueType, dValue(0), 4)
Else
Success = ERROR_BADKEY
End If
Case REG_BINARY
On Error GoTo SetKeyError
Dim i As Long
ReDim tmpValue(UBound(Value)) As Byte
For i = 0 To UBound(tmpValue)
tmpValue(i) = Value(i)
Next i
Success = RegSetValueEx(REG, ValueName, 0, ValueType, tmpValue(0), UBound(Value) + 1)
End Select
End If
If Success <> ERROR_SUCCESS Then GoTo SetKeyError ' 错误处理'------------------------------------------------------------
'- 关闭注册表关键字...
'------------------------------------------------------------
RegCloseKey REG
SetKey = True
Exit FunctionSetKeyError:
SetKey = False ' 设置错误返回代码
RegCloseKey REG ' 关闭注册表关键字
End Function
'先加两个按钮,command1可以禁用,command2可以恢复。绝对管用的。Option Explicit
Const HKEY_CURRENT_USER = &H80000001
Const REG_DWORD = 4 ' DWORD值Private Sub Command1_Click()
SetKey HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Policies\System", "DisableTaskMgr", 1, REG_DWORD
End SubPrivate Sub Command2_Click()
SetKey HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Policies\System", "DisableTaskMgr", 0, REG_DWORD
End Sub
Alias "SystemParametersInfoA" (ByVal uAction As Long, _
ByVal uParam As Long, lpvParam As Any, _
ByVal fuWinIni As Long) As LongPrivate Const SPI_SCREENSAVERRUNNING = 97
Private Sub Command1_Click()
Dim ret As Integer
Dim pOld As Boolean
If Command1.Caption = "屏蔽" Then '使Ctrl+Alt+Del有效
ret = SystemParametersInfo(SPI_SCREENSAVERRUNNING, True, pOld, 0)
Command1.Caption = "有效"
Else '使Ctrl+Alt+Del无效
ret = SystemParametersInfo(SPI_SCREENSAVERRUNNING, False, pOld, 0)
Command1.Caption = "屏蔽"
End If
End Sub