Private Declare Function DeleteMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
Private Declare Function GetMenuItemCount Lib "user32" (ByVal hMenu As Long) As Long
Private Const MF_BYPOSITION = &H400&
Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
Private Sub Form_Load()
Dim hwndMenu As Long
Dim c As Long
hwndMenu = GetSystemMenu(Me.hwnd, 0)
c = GetMenuItemCount(hwndMenu)
DeleteMenu hwndMenu, c - 1, MF_BYPOSITION
c = GetMenuItemCount(hwndMenu)
DeleteMenu hwndMenu, c - 1, MF_BYPOSITION
End Sub
Private Declare Function GetMenuItemCount Lib "user32" (ByVal hMenu As Long) As Long
Private Const MF_BYPOSITION = &H400&
Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
Private Sub Form_Load()
Dim hwndMenu As Long
Dim c As Long
hwndMenu = GetSystemMenu(Me.hwnd, 0)
c = GetMenuItemCount(hwndMenu)
DeleteMenu hwndMenu, c - 1, MF_BYPOSITION
c = GetMenuItemCount(hwndMenu)
DeleteMenu hwndMenu, c - 1, MF_BYPOSITION
End Sub
sexing
不让关闭啊?
hehe
Private Declare Function GetMenuItemCount Lib "user32" (ByVal hMenu As Long) As Long
Private Const MF_BYPOSITION = &H400& Private Sub Form_Load()
Dim hwndMenu As Long
Dim c As Long
hwndMenu = GetSystemMenu(Me.hwnd, 0)c = GetMenuItemCount(hwndMenu)DeleteMenu hwndMenu, c - 1, MF_BYPOSITIONc = GetMenuItemCount(hwndMenu)
DeleteMenu hwndMenu, c - 1, MF_BYPOSITIONEnd Sub
你有更好的办法吗?
If Shift = 4 And KeyCode = vbKeyF4 Then
KeyCode = 0 '注意这个值
End If
End Sub
Private Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
Private Declare Function GetMenuItemCount Lib "user32" (ByVal hMenu As Long) As Long
Const MF_BYCOMMAND = &H0&
Const MF_REMOVE = &H1000&
Const MF_BYPOSITION = &H400&Private Sub Form_Load()
Dim hSysMenu As Long, nCnt As Long
' Get handle to our form's system menu
' (Restore, Maximize, Move, close etc.)
hSysMenu = GetSystemMenu(Me.hwnd, False)
If hSysMenu Then
' Get System menu's menu count
nCnt = GetMenuItemCount(hSysMenu)
If nCnt Then
' Menu count is based on 0 (0, 1, 2, 3...)
RemoveMenu hSysMenu, nCnt - 1, MF_BYPOSITION Or MF_REMOVE
RemoveMenu hSysMenu, nCnt - 2, MF_BYPOSITION Or MF_REMOVE ' Remove the seperator
'DrawMenuBar Me.hwnd
' Force caption bar's refresh. Disabling X button
'Me.Caption = "Try to close me!"
End If
End If
End Sub
关闭按钮失效,应该可以达到您的要求
cancel=1
end sub
OK!分!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
我们的还可以灰掉那个button早知道就不用牛刀了
最简单的也就是最有效的!
tanaya(蜡笔小新) 你的方法不好使 "
-------------------------------------------------------------------Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If Shift = 4 And KeyCode = vbKeyF4 Then
KeyCode = 0 '注意这个值
End If
End Sub我再次表明,上面代码是很好的,你们可以试试,一定没有问题啊
如果你一定要用API实现,那自然是高级啦。
但总觉得杀鸡用牛刀的感觉啊......
不信你试试,你上边的代码我试了,无效。
都有分啦
结果Alt+F4还可以关闭
看来只是去掉了而已,没有去掉事件
只要你希望无法使用alt+f4的窗口是你自己的窗口就可以
如果想要全部的窗口都无法使用的话,需要全局的hookcoffee.bas内容:
Option ExplicitPublic Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
Public Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Public 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
Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As LongPublic hnexthookproc As Long
Public Const HC_ACTION = 0
Public Const WH_KEYBOARD = 2
Public Function MyHotKey(vKeyCode) As Boolean
MyHotKey = ((GetAsyncKeyState(vKeyCode) < 0))
End FunctionPublic Sub UnHookKBD()
If hnexthookproc <> 0 Then
UnhookWindowsHookEx hnexthookproc
hnexthookproc = 0
End If
End Sub
Public Function EnableKBDHook()
If hnexthookproc <> 0 Then
Exit Function
End If
hnexthookproc = SetWindowsHookEx(WH_KEYBOARD, AddressOf _
MyKBHFunc, App.hInstance, 0)
If hnexthookproc <> 0 Then
EnableKBDHook = hnexthookproc
End If
End Function
Public Function MyKBHFunc(ByVal iCode As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
'wParam 是传入按了哪个key的virtual-key code
'如果直接使用下面两行代码则所有键盘的输入皆没有作用
'MyKBHFunc = 1 '吃掉讯息
'Exit Function MyKBHFunc = 0 '讯息要处理
If iCode < 0 Then
MyKBHFunc = CallNextHookEx(hnexthookproc, iCode, wParam, lParam)
Exit Function
End If
If wParam = 115 Then '侦测 有没有按到选定的按键(这里是F4)
MyKBHFunc = 0 '先设定为处理信息
If MyHotKey(18) Then MyKBHFunc = 1 '如果当时也按了ALT就便吃掉这个讯息
If MyKBHFunc = 1 Then Form1.Caption = "你刚才的键盘输入为Alt+F4,表示要将程序关闭!"
Else
Call CallNextHookEx(hnexthookproc, iCode, wParam, lParam)
End If
End Functionmain.frm的内容:
Private Sub Form_Load()
Call EnableKBDHook
End SubPrivate Sub Form_Unload(Cancel As Integer)
Call UnHookKBD
End Sub有用的话要给分啊,这个是牛刀啊
一定要给分哦,谢谢了
上面的:
If MyKBHFunc = 1 Then Form1.Caption = "你刚才的键盘输入为Alt+F4,表示要将程序关闭!"这句应该为:
If MyKBHFunc = 1 Then main.Caption = "你刚才的键盘输入为Alt+F4,表示要将程序关闭!"
或者msgbox "您企图用Alt+F4关闭本程序!请用其他方式退出!"
放心吧,你的帖子很有价值,结帖的时候不会忘你的
------------
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If Shift = 4 And KeyCode = vbKeyF4 Then
KeyCode = 0 '注意这个值
End If
End Sub
------------
昨日测试有误,再次测试通过。十分抱歉!!