我要响应在窗体的控制栏(controlsbox)的单击事件,如何写?

解决方案 »

  1.   

    截获系统消息WM_SYSCOMMAND
    插入你的菜单到系统菜单,然后增加响应
      

  2.   

    变通的办法,不要修改窗体的BorderStyle,这样双击(可惜不是单击)标题栏时就相当于点击了最大化,所以就可以在resize事件里写代码控制了Private Sub Form_Resize()
        If Me.WindowState Then Me.Hide
        Me.WindowState = 0
    End Sub
      

  3.   

    online(龙卷风V2.0--再战江湖)兄 能否说得详细一此呢?
      

  4.   

    建菜单[退出],[新菜单]
    Private Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long
    Private Declare Function GetSubMenu Lib "user32" _
        (ByVal hMenu As Long, _
        ByVal nPos As Long _
        ) As Long
    Private Declare Function GetMenuItemID Lib "user32" _
        (ByVal hMenu As Long, _
        ByVal nPos As Long _
        ) As Long
    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 RemoveMenu Lib "user32" _
        (ByVal hMenu As Long, _
        ByVal nPosition As Long, _
        ByVal wFlags As Long _
        ) As Long
    Private Declare Function ModifyMenu Lib "user32" Alias "ModifyMenuA" _
        (ByVal hMenu As Long, _
        ByVal nPosition As Long, _
        ByVal wFlags As Long, _
        ByVal wIDNewItem As Long, _
        ByVal lpString As Any) _
        As Long
    Private Declare Function InsertMenu Lib "user32" Alias "InsertMenuA" _
        (ByVal hMenu As Long, _
        ByVal nPosition 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 Const MF_BYCOMMAND = &H0&
    Private Const MF_BYPOSITION = &H400&
    Private Const MF_CHANGE = &H80&
    Private Const MF_REMOVE = &H1000&
    '子过程
    '除去系统菜单中旧的菜单项
    Private Sub RemoveOldMenu()
        Dim hSysMenu As Long
        Dim nCnt As Long
        hSysMenu = GetSystemMenu(Me.hwnd, False)
        If hSysMenu Then
            ' 取得系统菜单中的数量
            nCnt = GetMenuItemCount(hSysMenu)
            If nCnt Then
                Dim i As Integer
                ' 编号 (0, 1, 2, 3...)
                For i = nCnt - 2 To 0 Step -1  '第一项不除去
                    RemoveMenu hSysMenu, i, MF_BYPOSITION Or MF_REMOVE
                Next i
            End If
        End If
    End Sub
    '插入新的菜单项
    Private Sub InsertMyMenu()
        Dim hSysMenu As Long
        Dim hMenu As Long
        Dim hSubMenu As Long
        Dim hMenuID As Long
        Dim sMenuString As String
        Dim nCnt As Integer
        sMenuString = Space(20)
        hSysMenu = GetSystemMenu(Me.hwnd, False)  '获得系统菜单句柄
        hMenu = GetMenu(Me.hwnd)    '获得窗体菜单句柄
        hSubMenu = GetSubMenu(hMenu, 1)  '获得子菜单句柄
        For nCnt = 0 To 3
            hMenuID = GetMenuItemID(hSubMenu, nCnt)  '获得菜单ID号
            GetMenuString hSubMenu, nCnt, sMenuString, Len(sMenuString), MF_BYPOSITION   '获得菜单的标题
            If nCnt = 0 Then
                '第一项菜单项没有去掉,用修改函数
                ModifyMenu hSysMenu, nCnt, MF_BYPOSITION, hMenuID, sMenuString
            Else
                '其它项用插入函数
                'InsertMenu hSysMenu, nCnt, MF_BYPOSITION, hMenuID, sMenuString
                InsertMenu hSysMenu, nCnt, MF_BYPOSITION, WM_USER + IDM_test, sMenuString
            End If
        Next nCnt
    End Sub
    Private Sub Form_Load()
        HookForm Me
        Call RemoveOldMenu
        Call InsertMyMenu
    End Sub
    Private Sub mnuExit_Click()
        UnHookForm Me
        Unload Me
    End SubPrivate Sub mnuNew1_Click()
    MsgBox "of"
    End Sub模块
    Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Private Declare Function DefWindowProc Lib "user32" Alias "DefWindowProcA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Public Const WM_DRAWCLIPBOARD = &H308
    Public Const GWL_WNDPROC = (-4)
    Public Const WM_SYSCOMMAND = &H112
    Public Const WM_USER = &H400
    Public Const IDM_test = 1Dim OldProc As Long
    Private Function addcallback(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Select Case wMsg
        Case WM_SYSCOMMAND
            Select Case wParam
                Case WM_USER + IDM_test
                    MsgBox "自定义消息"
                Case Else
                    addcallback = DefWindowProc(hwnd, wMsg, wParam, lParam)
            End Select
            Exit Function
        Case Else
            addcallback = CallWindowProc(OldProc, hwnd, wMsg, wParam, lParam)
    End Select
                
    End FunctionPublic Sub HookForm(F As Form)
        OldProc = SetWindowLong(F.hwnd, GWL_WNDPROC, AddressOf addcallback)
    End Sub
    Public Sub UnHookForm(F As Form)
        SetWindowLong F.hwnd, GWL_WNDPROC, OldProc
    End Sub