在 Query_Unload 事件过程或 Form_Unload 事件过程中设置 cancel 参数为 True 可防止窗体被卸载

解决方案 »

  1.   

    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 Long
    Private Declare Function AppendMenu Lib "User32" Alias "AppendMenuA" (ByVal hMenu As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpNewItem As Any) As Long
    Private Declare Function GetMenuString Lib "User32" Alias "GetMenuStringA" (ByVal hMenu As Long, ByVal wIDItem As Long, ByVal lpString As String, ByVal nMaxCount As Long, ByVal wFlag As Long) As Long
    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
    Const WM_NCLBUTTONDBLCLK = &HA3
    Const WM_NCLBUTTONDOWN = &HA1
    Const HTCAPTION = 2
    Const MF_STRING = &H0&
    Const MF_BYCOMMAND = &H0&
    Const SC_CLOSE = &HF060
    Private hMenu As Long
    Private CloseStr As String '纪录Close MenuItem的字符串
    Private Sub Command1_Click()
    '将"关闭"的那个MenuItem重新加入
    Call AppendMenu(hMenu, MF_STRING, SC_CLOSE, CloseStr)
    '令"X"出现Enable的颜色
    Call SendMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&)
    End Sub
    Private Sub Form_Load()
    hMenu = GetSystemMenu(Me.hwnd, 0)
    CloseStr = String(255, 0)
    'SC_CLOSE即是"关闭"的MenuItem ID
    Call GetMenuString(hMenu, SC_CLOSE, CloseStr, 256, MF_BYCOMMAND)
    CloseStr = Left(CloseStr, InStr(1, CloseStr, Chr(0)) - 1)
    Call DeleteMenu(hMenu, SC_CLOSE, MF_BYCOMMAND)
    End Sub
      

  2.   

    窗体属性ControlBox=False
    或者用API
    Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
    Private Declare Function GetMenuItemCount Lib "user32" (ByVal hMenu As Long) As Long
    Private Declare Function DrawMenuBar Lib "user32" (ByVal hwnd As Long) As Long
    Private Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
    Const MF_BYPOSITION = &H400&
    Const MF_REMOVE = &H1000&
    Private Sub Form_Load()
        Dim hSysMenu As Long, nCnt As Long
        hSysMenu = GetSystemMenu(Me.hwnd, False)    If hSysMenu Then
            nCnt = GetMenuItemCount(hSysMenu)
            If nCnt Then
               '去掉'X'
               RemoveMenu hSysMenu, nCnt - 1, MF_BYPOSITION Or MF_REMOVE
               DrawMenuBar Me.hwnd
             End If
        End If
      

  3.   

    呵呵,我找遍所有的API函数,竟然没有发现禁止“关闭”的函数,但我又曾经见过这样的程序,哪位高手知道的话麻烦也通知我一声,呵呵呵。
    我的信箱是:[email protected]
      

  4.   

    哇,我只是发一条信息,竟然就这么多人回复了,csdn真不简单!!
      

  5.   

    我有一个模块!要我给你!在程序中CALL 函数就可以了!我的邮件[email protected]
      

  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 Long
    Private Declare Function GetMenuItemCount Lib "User32" (ByVal hMenu As Long) As Long
    Private Const MF_BYPOSITION = &H400&
    Private Const MF_DISABLED = &H2&Sub Form_load()
        Dim hMenu As Long
        Dim nCount As Long
        
        '取得系统菜单句柄
        hMenu = GetSystemMenu(Me.hWnd, 0)
        '取得菜单项个数,为了下一步的删除最后一项
        nCount = GetMenuItemCount(hMenu)
        '删除最后一项,也就是关闭项,这项一删除,关闭按钮就变灰了,不可用了
        RemoveMenu hMenu, nCount - 1, MF_DISABLED Or MF_BYPOSITION
    End Sub
      

  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
    Private Const MF_BYPOSITION = &H400&
    Private Const MF_DISABLED = &H2&Sub Form_load()
        Dim hMenu As Long
        Dim nCount As Long
        
        '取得系统菜单句柄
        hMenu = GetSystemMenu(Me.hWnd, 0)
        '取得菜单项个数,为了下一步的删除最后一项
        nCount = GetMenuItemCount(hMenu)
        '删除最后一项,也就是关闭项,这项一删除,关闭按钮就变灰了,不可用了
        RemoveMenu hMenu, nCount - 1, MF_DISABLED Or MF_BYPOSITION
    End Sub
      

  8.   

      很简单的!只要设置一下form的属性就可以了,form1.BorderStyle=0把form的关闭按钮就去掉,关闭按钮不就不可用了吗?想用时再把它的属性回复过来不就可以了吗?没必要动不动就调用API函数,大家说对吧?