楼主 amulee |
Q:如何去除MsgBox函数对话框的关闭按钮? A:效果如图所示:
利用API钩子来实现,原理类似于制作密码输入的InputBox。找到了窗体,当然就可以设置咯,可以设置很多有趣的功能,详见:[Excel VBA] 利用API对VBA窗体进行设置 http://www.exceltip.net/thread-6982-1-1.html
代码如下:- 'API声明
- Option Explicit
- Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
- Private 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
- Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
- Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
- Private Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long
- Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long
- Private 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 FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
- Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
- '常数声明
- Private Const WH_CBT = 5
- Private Const HCBT_ACTIVATE = 5
- Private hHook As Long
- '由于要查找窗体,标题写在这里
- Private Const MsgTitle As String = "标题"
- Private Const WM_SYSCOMMAND = &H112 '窗体设置
- Private Const SC_MAXIMIZE = &HF030& '最大化窗体
- Private Function HookProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
- If nCode = HCBT_ACTIVATE Then
- '设置窗体样式为无按钮
- SetWindowLong FindWindow(vbNullString, MsgTitle), -16, &H6C10000
- End If
- '以下这行确保其他钩子能够被正确调用
- CallNextHookEx hHook, nCode, wParam, lParam
- End Function
- '自定义MsgBox函数
- Public Function MyMsgBox(Optional Prompt As String, Optional VbMsgBoxStyle As VbMsgBoxStyle, Optional Title As String)
- '钩子
- hHook = SetWindowsHookEx(WH_CBT, AddressOf HookProc, GetModuleHandle(vbNullString), GetCurrentThreadId)
- '调用Msgbox函数
- MyMsgBox = MsgBox(Prompt, VbMsgBoxStyle, Title)
- '取消钩子
- UnhookWindowsHookEx hHook
- End Function
- '示例程序
- Sub Main()
- MyMsgBox "OK", vbOKOnly, MsgTitle
- End Sub
附件下载:
去除关闭按钮的Msgbox.rar |