vb中调用api屏蔽关闭按钮

解决方案 »

  1.   

    Option Explicit'禁止使用 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 Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As LongPrivate 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_BYPOSITION
    c = GetMenuItemCount(hwndMenu)
    DeleteMenu hwndMenu, c - 1, MF_BYPOSITION
    End Sub
      

  2.   

    声明:
    Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
    Declare Function GetMenuItemCount Lib "user32" (ByVal hMenu As Long) As Long
    Declare Function DrawMenuBar Lib "user32" (ByVal hwnd As Long) As Long
    Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As LongPublic Const MF_BYPOSITION = &H400&
    Public Const MF_REMOVE = &H1000&
    使用:
    Private Sub Form_Load()
    Dim hSysMenu As Long
    Dim nCnt As Long
    Me.Show
    hSysMenu = GetSystemMenu(Me.hwnd, False)
    If hSysMenu Then
    ' 取得系统菜单中的数量 
    nCnt = GetMenuItemCount(hSysMenu)If nCnt Then
    ' 编号 (0, 1, 2, 3...)
    RemoveMenu hSysMenu, nCnt - 1, MF_BYPOSITION Or MF_REMOVE
    '去掉 关闭 按钮
    RemoveMenu hSysMenu, nCnt - 2, MF_BYPOSITION Or MF_REMOVE 
    ' 去掉一个下划线
    '注意下面的语句, 请根据不同 Form 类别具体情况进行调试,
    ' 没个语句将关闭不同的功能!!
    'RemoveMenu hSysMenu, nCnt - 3, MF_BYPOSITION Or MF_REMOVE
    'RemoveMenu hSysMenu, nCnt - 4, MF_BYPOSITION Or MF_REMOVE
    'RemoveMenu hSysMenu, nCnt - 5, MF_BYPOSITION Or MF_REMOVE
    DrawMenuBar Me.hwnd 
    ' 重画
    End If
    End If
    End Sub提供的方法二:
    Const MF_REMOVE = &H1000&
    Const SC_CLOSE = &HF060
    Const SC_MAXIMIZE = &HF030
    并在 Sub Form_Load()中加入:
    RemoveMenu GetSystemMenu(hwnd, 0), SC_CLOSE, MF_REMOVE
    这样就可以使关闭按钮无效。同样加入
    RemoveMenu GetSystemMenu(hwnd, 0), SC_MAXIMIZE, MF_REMOVE
      

  3.   

    Option Explicit'禁止使用 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 Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As LongPrivate 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_BYPOSITION
    c = GetMenuItemCount(hwndMenu)
    DeleteMenu hwndMenu, c - 1, MF_BYPOSITION
    End SubAlt+F4 关闭窗口 没有起作用!是关闭窗体的关闭按钮!
      

  4.   

    使窗体右上角的X按钮失效 
      
      窗体右上角的X按钮通常用来关闭一个程序,这个小X按钮实际上是和系统菜单的“关闭”菜单项关联在一起的,什么?不知道什么是系统菜单,系统菜单是指我们点击窗体左上角的小图标时所弹出的菜单,其中好象有“恢复”、“移动”、“最大化”、“最小化”、“关闭”这么几个按钮。这个菜单用普通的方法是不能编辑和改变的,但是我们可以通过API函数GetSystemMenu来得到它的句柄,然后通过菜单相关的API函数就能改变它了,下面一起看看怎么做吧。    程序中用到了两个API函数GetSystemMenu、RemoveMenu,其中GetSystemMenu函数用来得到系统菜单的句柄,RemoveMenu用来删除指定的菜单条目,我们先来看看这个函数的声明和参数:   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  其中各GetSystemMenu参数的意义如下表:参数: 意义 
    hwnd Long, 系统菜单所在窗口的句柄bRevert Long,如设为TRUE,表示恢复原始的系统菜单返回值 Long,如执行成功,返回系统菜单的句柄;零意味着出错。如bRevert设为TRUE,也会返回零(简单的恢复原始的系统菜单)   而RemoveMenu参数的意义如下表:参数: 意义 
    hMenu Long,菜单的句柄nPosition Long,欲改变的菜单条目的标识符。如在wFlags参数中指定了MF_BYCOMMAND,这个参数就代表欲改变的菜单条目的命令ID。如设置的是MF_BYPOSITION,这个参数就代表菜单条目在菜单中的位置(第一个条目的位置为零)wFlags Long,常数MF_BYCOMMAND=&H0&或MF_BYPOSITION=&H400&,取决于nPosition参数 
    返回值 Long,非零表示成功,零表示失败。   然后就可以在程序中使用这两个函数了,我们在窗体的Form_Load()过程中加入如下代码:   MyMenu = GetSystemMenu(Me.hwnd,0)    '得到系统菜单的句柄,Me.hwnd表示当前窗体的句柄   RemoveMenu MyMenu, &HF060, MF_BYCOMMAND '移去“关闭”菜单项,&HF060“关闭”菜单项的命令ID  接着我们运行程序,看看窗体右上角的X按钮是不是已经不可点击了,系统菜单中的“关闭”项也消失了,不过要记着为程序留一个“退出”按钮哦!
    Private Declare Function GetSystemMenu Lib "user32" _
    (ByVal hwnd As Long, ByVal bRevert As Long) As LongPrivate 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 LongConst MF_BYPOSITION = &H400&Private Sub Disabled()
        Dim hwndMenu As Long
        Dim c As Long
        '获得系统菜单的句柄
        hwndMenu = GetSystemMenu(frmMain.hwnd, 0)
        '获得系统菜单的项目相数
        c = GetMenuItemCount(hwndMenu)
        '删除最后一个菜单项
        DeleteMenu hwndMenu, c - 1, MF_BYPOSITION
        '获得系统菜单的项目相数
        c = GetMenuItemCount(hwndMenu)
        '删除最后一个菜单项
        DeleteMenu hwndMenu, c - 1, MF_BYPOSITION
    End SubPrivate Sub Cmd_Click()
        End
    End SubPrivate Sub Command1_Click()
        Disabled
    End Sub
      

  5.   

    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 LongPrivate Sub Form_Load()
    RemoveMenu GetSystemMenu(Me.hwnd, 0), 6, &H400&
    End Sub
      

  6.   

    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 LongPrivate Sub Form_Load()
        RemoveMenu GetSystemMenu(Me.hwnd, 0), &HF060, 0
    End Sub
      

  7.   

    这样就行了:
    Option ExplicitPrivate Sub Form_Unload(Cancel As Integer)
        Cancel = 1
    End Sub
      

  8.   

    //vb中调用api屏蔽关闭按钮他非要API。没办法。
      

  9.   

    我觉得Cancel = 1还是比较好
    这样用SendMessage form1.hwnd, WM_CLOSE, 0, 0也无法关闭
    而RemoveMenu GetSystemMenu(Me.hwnd, 0), &HF060, 0这种方法就可以用上面的语句关闭他
      

  10.   

    Cancel = 1可以终止进程来关闭。还不是一样。想关闭总会有办法的。
      

  11.   

    我请问一下,有没有办法调用API来阻止关闭其它应用程序(EXCELL)的问题,
    这个是不是更有趣一点,,
      

  12.   

    可以把EXCELL的关闭菜单去掉。
    RemoveMenu GetSystemMenu(EXECELL.hwnd, 0), 6, &H400&
      

  13.   

    还可以用全局的HOOK截取WM-CLOSE、关机、重启、注销等消息。但是,理论上讲,单独一个程序,没有关不掉的。