API函数GetSystemMenu、DeleteMenu、GetMenuString可以实现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 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 LonghMenu = GetSystemMenu(Me.hWnd, 0)
CloseStr = String(255, 0)
Call GetMenuString(hMenu, &HF060, CloseStr, 256, &H0&)
CloseStr = Left(CloseStr, InStr(1, CloseStr, Chr(0)) - 1)
Call DeleteMenu(hMenu, &HF060, &H0&)

解决方案 »

  1.   

    ControlBox Enable=false ⿪
      

  2.   

    '三个API函数的声明
    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 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 Longsub form_load()
    '以上三个API函数的实现方法
    hMenu = GetSystemMenu(Me.hWnd, 0)
    CloseStr = String(255, 0)
    Call GetMenuString(hMenu, &HF060, CloseStr, 256, &H0&)
    CloseStr = Left(CloseStr, InStr(1, CloseStr, Chr(0)) - 1)
    Call DeleteMenu(hMenu, &HF060, &H0&)
    end sub
      

  3.   

    如何使窗体右上角的"X"无效?   
          
        要Disable Form "X" -->Close的功能(便暗灰色),事实上便是从Form左上方的SystemMenu将关闭的MenuItem去除掉便可以了,去除后,又该如何,那便是在将关闭(Close)的MenuItem加回去 但这里有个小问题,加回去之后"X"仍是暗灰色,要等到我们做了某些固定的动作之后(如TittleBar上Click一下,或选一下SystemMenu等), 我不知道让TittleBar上的这些东西Refresh要送什么消息,所以现在我暂且Send一个在TittleBar上按下Mouse左键的消息给窗体,令"X"能出现的Enable颜色
    在窗体上放置一个Command Button,输入以下代码,运行,点击一下Command Button 就可使"X" Enable.
    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
      

  4.   

    还有这个试一下。
    如何让窗体右上角的X失效? 
    在VB中,每个窗体都有两个卸载事件,不同的是,QueryUnload事件不仅允许用户
    取消进程,并且告诉程序做些什么来开始卸载工作。为使窗体右上角的X失效,并
    下面的代码放在该事件中就行了。Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) 
    Cancel = -1End Sub
      

  5.   

    同意楼上的!这是最简单的办法.你还可以设定一个全局变量,作为判断条件,来控制
    是否允许退出.
    public m_quit as booleanPrivate Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) 
        if m_quit then  
           Cancel = 0
        else
           Cancel = -1
        end if
    End Sub