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

解决方案 »

  1.   

    hehe
    sexing
    不让关闭啊?
    hehe
      

  2.   

    禁止使用 Alt+F4 关闭窗口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 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
      

  3.   

    gump2000(阿甘) :
    你有更好的办法吗?
      

  4.   

    lihonggen0(用VB)兄的方法还是不行,只能让关闭按钮失效,但还是不能屏蔽Art+F4键
      

  5.   

    !!!!!!!!!!!!!!!!!!!!!!!! 最好的办法 !!!!!!!!!!!!!!!!!!!!!!!!下面我给你一个实例:Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
     If Shift = 4 And KeyCode = vbKeyF4 Then
        KeyCode = 0 '注意这个值
     End If
    End Sub
      

  6.   

    想限制Windows中的话这样可能不幸哦:)
      

  7.   

    Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
    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
    关闭按钮失效,应该可以达到您的要求
      

  8.   

    tanaya(蜡笔小新) 你的方法不好使
      

  9.   

    form_unload(cancel as integer)
    cancel=1
    end sub
    OK!分!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      

  10.   

    lxqlogo0(群子)的方法确实可行,看来最简单的也就是最好的。没话说,给分
      

  11.   

    faint
    我们的还可以灰掉那个button早知道就不用牛刀了
      

  12.   

    gump2000(阿甘)兄,灰掉button也没用呀,也不能屏蔽Art+F4
      

  13.   

    lxqlogo0(群子) :
    最简单的也就是最有效的!
      

  14.   

    按Alt+F4难道还能关掉form,我就不相信了
      

  15.   

    To "gaoqi5037(高岐) ( ) 
        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实现,那自然是高级啦。
    但总觉得杀鸡用牛刀的感觉啊......
      

  16.   

    gump2000(阿甘):
    不信你试试,你上边的代码我试了,无效。
      

  17.   

    tanaya(蜡笔小新)的方法也行呀
    都有分啦
      

  18.   

    天,还真不行,我只一为去掉了CloseButton就可以了
    结果Alt+F4还可以关闭
    看来只是去掉了而已,没有去掉事件
      

  19.   

    看看hook的方法吧(杀鸡用牛刀)
    只要你希望无法使用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有用的话要给分啊,这个是牛刀啊
    一定要给分哦,谢谢了
      

  20.   

    对不起,有点小错误:
    上面的:
    If MyKBHFunc = 1 Then Form1.Caption = "你刚才的键盘输入为Alt+F4,表示要将程序关闭!"这句应该为:
    If MyKBHFunc = 1 Then main.Caption = "你刚才的键盘输入为Alt+F4,表示要将程序关闭!"
    或者msgbox "您企图用Alt+F4关闭本程序!请用其他方式退出!"
      

  21.   

    bestofbest(咖啡):
    放心吧,你的帖子很有价值,结帖的时候不会忘你的
      

  22.   

    遍一个窗口函数,截获传给该窗体的WM_ENDSESSION消息,然后屏蔽掉它就可以了。呵呵 是不是有分啊。
      

  23.   

    To:  tanaya(蜡笔小新)
    ------------
    Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
     If Shift = 4 And KeyCode = vbKeyF4 Then
        KeyCode = 0 '注意这个值
     End If
    End Sub
    ------------
         昨日测试有误,再次测试通过。十分抱歉!!