不调用QueryUnload事件以及Unload事件。

解决方案 »

  1.   

    不掉用Unload事件?我不知道,谁知道?我听听!
      

  2.   

    如何使窗体右上角的"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)
      

  3.   

    续上:
    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.   

    把 Unload 中的
    cancel=1 就行了
      

  5.   

    Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
        Cancel = 1 '(或者其它非0数均可)
    End Sub
      

  6.   

    大家怎么不看清出题目麻?
    应该rainstormmaster(rainstormmaster) 的解答是合理的。其实可以更简单一点罗Public Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
    Public Declare Function GetMenuItemCount Lib "user32" (ByVal hMenu As Long) As Long
    Public Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
    Public Declare Function DrawMenuBar Lib "user32" (ByVal hwnd As Long) As LongPublic Const MF_BYPOSITION = &H400&
    Public Const MF_DISABLED = &H2&
    Public Sub DisableX(Frm As Form)
        Dim hMenu As Long, nCount As Long
        hMenu = GetSystemMenu(Frm.hwnd, 0)
        nCount = GetMenuItemCount(hMenu)
        Call RemoveMenu(hMenu, nCount - 1, MF_DISABLED Or MF_BYPOSITION)    DrawMenuBar Frm.hwndEnd Sub
      

  7.   

    4、             使窗体右上角的X无效,禁止Alt+F4关闭窗体在特殊窗体的应用中,我们有时需要把窗体右上角标题栏上的关闭按钮屏幕,当用户点击其它地方(比如说一个Button)退出,那我们怎么做呢?。 我们还是来看一下在VB6中的实现,VB6中实现(借助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        ' 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 IfEnd Sub '如果还要屏蔽Alt+F4,加上    Private Sub Form_QueryUnload(ByVal Cancel As Integer, ByVal UnloadMode As Integer)        Cancel = 1    End Sub
      

  8.   

    http://www.csdn.net/develop/read_article.asp?id=18774
      

  9.   

    '关闭窗口的所有菜单功能
    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, i As Long
        hSysMenu = GetSystemMenu(Me.hwnd, False)
        If hSysMenu Then
            nCnt = GetMenuItemCount(hSysMenu)
            For i = nCnt To 0 Step -1
                RemoveMenu hSysMenu, i, MF_BYPOSITION Or MF_REMOVE  ' Remove the seperator
                DrawMenuBar Me.hwnd
                Me.Caption = "Try to close me!"
            Next
        End If
    End Sub
      

  10.   

    1.使用API可以实现X按钮变灰;
    2.
    Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
        Cancel = true
    End Sub
    这样也可以,不过最好还是对UnloadMode进行一下判断,对应该Cancel的消息才Cancel.