比你另一帖的要求稍微复杂一点: '模块中: 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事件
如果command是其他人写的程序那就很麻烦了
'模块中:
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事件