呵呵,要稍微麻烦一些;关键是要自己写一个 WindowProc,截获 CBN_DROPDOWN 和 CBN_CLOSEUP 消息;设置一个开关变量,收到 CBN_DROPDOWN 时 + 1,收到 CBN_CLOSEUP 时 - 1,变量为 0 是证明没有 ComboBox 的下拉框。Public.bas:Option ExplicitPublic 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
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPublic Const WM_COMMAND = &H111
Public Const CBN_CLOSEUP = 8
Public Const CBN_DROPDOWN = 7
Public Const GWL_WNDPROC = -4Public g_lPrevProc As Long
Public g_nFlip As LongPublic Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    If uMsg = WM_COMMAND Then
        ' High-order word is the notification message
        ' Thus we divide wParam by 65536 (&HFFFF)
        If wParam \ 65536 = CBN_CLOSEUP Then
            g_nFlip = g_nFlip - 1
            Beep
        ElseIf wParam \ 65536 = CBN_DROPDOWN Then
            g_nFlip = g_nFlip + 1
            Beep
        Else
            WindowProc = CallWindowProc(g_lPrevProc, hwnd, uMsg, wParam, lParam)
        End If
    Else
        WindowProc = CallWindowProc(g_lPrevProc, hwnd, uMsg, wParam, lParam)
    End If
End FunctionfrmMain.frm:Private Sub Form_Load()
    g_lPrevProc = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub