如何通过API,实现COMMAND控件不击发CLICK事件,但能击发MOUSEDOWN事件?(注意:用API)

解决方案 »

  1.   

    ????连续两个同类贴????
    如果command是其他人写的程序那就很麻烦了
      

  2.   

    比你另一帖的要求稍微复杂一点:
    '模块中:
    Option ExplicitPublic Const GWL_WNDPROC = (-4)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
    Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
    Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPublic prevWndProc As LongFunction WndProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
      
        On Error Resume Next
        If Msg = &H201 Or Msg = &O202 Then
        Debug.Print Msg
        If Msg = &H201 Then Call Form1.Command1_MouseDown(1, 0, 0, 0)
        Else
        WndProc = CallWindowProc(prevWndProc, hWnd, Msg, wParam, lParam)
        End If
    End Function'程序中:
    Option ExplicitPrivate Sub Command1_Click()
    Print "click"
    End SubSub Command1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Print Str(Button) + "Button mousedown"
    End SubPrivate Sub Form_Load()
        prevWndProc = GetWindowLong(Command1.hWnd, GWL_WNDPROC)
        SetWindowLong Command1.hWnd, GWL_WNDPROC, AddressOf WndProc
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        SetWindowLong Command1.hWnd, GWL_WNDPROC, prevWndProc
    End Sub说明:
    1。上述代码是通过拦截command1的"WM_LBUTTONDOWN"、 "WM_LBUTTONUP"消息然后再判断是否触发Command1_MouseDown事件代码来实现目的的
    2.由于要在模块中触发Command1_MouseDown,所以form1的Command1_MouseDown事件不能为Private ,要把Private去掉。
    3。右击按钮也会触发mousedown事件