只有带Cancel按钮的msgbox窗口关闭按钮才会有效。 只有两个值会出现Cancel按钮vbOKCancel和vbYesNoCancel。用CBTHook让它无效如下: '以下在Form Private Sub Form_Load() Call EnableHook MsgBox "Fool azrael,HAHA!", vbOKCancel Call FreeHook End Sub '以下在.Bas Declare Function SetWindowsHookEx Lib "User32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long Declare Function UnhookWindowsHookEx Lib "User32" (ByVal hHook As Long) As Long Declare Function CallNextHookEx Lib "User32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long Private Declare Function GetSystemMenu Lib "User32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long Private Declare Function DeleteMenu Lib "User32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As LongPublic Const HCBT_ACTIVATE = 5 Public Const WH_CBT = 5 Const MF_BYCOMMAND = &H0& Const SC_CLOSE = &HF060 Public hHook As LongPublic Sub EnableHook() If hHook = 0 Then hHook = SetWindowsHookEx(WH_CBT, AddressOf HookProc, 0, App.ThreadID) End If End Sub Public Sub FreeHook() If hHook <> 0 Then Call UnhookWindowsHookEx(hHook) hHook = 0 End If End Sub Public Function HookProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Dim hMenu As Long If nCode < 0 Then HookProc = CallNextHookEx(hHook, nCode, wParam, lParam) Exit Function End If If nCode = HCBT_ACTIVATE Then hMenu = GetSystemMenu(wParam, 0) DeleteMenu hMenu, SC_CLOSE, MF_BYCOMMAND End If HookProc = 0 End Function
MsgBox "err", vbInformation + vbYesNo
只有两个值会出现Cancel按钮vbOKCancel和vbYesNoCancel。用CBTHook让它无效如下:
'以下在Form
Private Sub Form_Load()
Call EnableHook
MsgBox "Fool azrael,HAHA!", vbOKCancel
Call FreeHook
End Sub
'以下在.Bas
Declare Function SetWindowsHookEx Lib "User32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Declare Function UnhookWindowsHookEx Lib "User32" (ByVal hHook As Long) As Long
Declare Function CallNextHookEx Lib "User32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function GetSystemMenu Lib "User32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
Private Declare Function DeleteMenu Lib "User32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As LongPublic Const HCBT_ACTIVATE = 5
Public Const WH_CBT = 5
Const MF_BYCOMMAND = &H0&
Const SC_CLOSE = &HF060
Public hHook As LongPublic Sub EnableHook()
If hHook = 0 Then
hHook = SetWindowsHookEx(WH_CBT, AddressOf HookProc, 0, App.ThreadID)
End If
End Sub
Public Sub FreeHook()
If hHook <> 0 Then
Call UnhookWindowsHookEx(hHook)
hHook = 0
End If
End Sub
Public Function HookProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim hMenu As Long
If nCode < 0 Then
HookProc = CallNextHookEx(hHook, nCode, wParam, lParam)
Exit Function
End If
If nCode = HCBT_ACTIVATE Then
hMenu = GetSystemMenu(wParam, 0)
DeleteMenu hMenu, SC_CLOSE, MF_BYCOMMAND
End If
HookProc = 0
End Function