如题

解决方案 »

  1.   

    重载Combo消息处理函数,截获Click事件及相应鼠标位置。
      

  2.   

    在Form中放置一个Combo控件
    添加如下代码
    Private Sub Form_Load()
        HookForm Me
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        UnHookForm Me
    End Sub添加一个模块,添加如下代码
    Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    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 LongPublic Const WM_DRAWCLIPBOARD = &H308
    Public Const GWL_WNDPROC = (-4)
    Public Const CBN_DROPDOWN = 7
    Public Const WM_COMMAND = &H111Private mpfnPrevProc    As Long
    Private mHookedForm     As FormPublic Sub HookForm(F As Form)
        Set mHookedForm = F
        mpfnPrevProc = SetWindowLong(F.hwnd, GWL_WNDPROC, AddressOf WindowProc)
    End SubPublic Sub UnHookForm(F As Form)
        Set mHookedForm = Nothing
        SetWindowLong F.hwnd, GWL_WNDPROC, mpfnPrevProc
    End SubPublic Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        On Error Resume Next
        Dim wNotifyCode As Integer
        Dim wID         As Integer
        Select Case uMsg
        Case WM_COMMAND
            wNotifyCode = Int(wParam / &H10000)
            wID = uMsg And &HFFFF
            'Debug.Print Hex(wParam), Hex(wNotifyCode), Hex(wID)
            Select Case wNotifyCode
            Case CBN_DROPDOWN
                MsgBox "DropDown"
                'Do something here...
            End Select
        End Select
        WindowProc = CallWindowProc(mpfnPrevProc, hwnd, uMsg, wParam, lParam)
    End Function
      

  3.   

    参看
    http://expert.csdn.net/Expert/topic/1682/1682900.xml?temp=.4137079
    我那个程序结构更好一点儿