我没有代码,但能解决问题:Function MouseHookProc(ByVal code As Long, ByVal wParam As Long, _
ByVal lParam As Long) As Long
其中lParam指向MOUSEHOOKSTRUCT 结构
这个结构中包含了对象的句并(hwnd),只要判断是否
是 form2的句并就可以了。代码不麻烦,你可以试试(需要用的CopyMemory函数) If code < 0 Then
MouseHookProc = CallNextHookEx(hHook, code, wParam, lParam)
Exit Function
End If
If wParam = WM_RBUTTONDOWN Or wParam = WM_RBUTTONUP Then
form2.aa
Exit Function
End If
MouseHookProc = 0 '表示要处理这个讯息
Call CallNextHookEx(hHook, code, wParam, lParam)
End Function
ByVal lParam As Long) As Long
其中lParam指向MOUSEHOOKSTRUCT 结构
这个结构中包含了对象的句并(hwnd),只要判断是否
是 form2的句并就可以了。代码不麻烦,你可以试试(需要用的CopyMemory函数) If code < 0 Then
MouseHookProc = CallNextHookEx(hHook, code, wParam, lParam)
Exit Function
End If
If wParam = WM_RBUTTONDOWN Or wParam = WM_RBUTTONUP Then
form2.aa
Exit Function
End If
MouseHookProc = 0 '表示要处理这个讯息
Call CallNextHookEx(hHook, code, wParam, lParam)
End Function
解决方案 »
- 不用WebBrowser完整的一次访问网站怎么做?
- 帮我分解出我要得到的字符串
- 如何在VBA中保持全局变量
- picturebox 怎么让它的(0,0)点在左下,而不是默认的左上啊?
- 关于 删除文件,急死我了
- 我的vb6.0里面怎么找不到Apex data bound grid(DBGrid)控件啊?
- 讨论一下,大家是如何学习和使用API函数的?
- 请大家谈谈关于控件的鼠标事件究竟该怎么用好吗?我的一个LISTBOX控件用了Click DbClick Getfouse LostFouse,结果发现双击经常需要双击2
- 请问何为Hook,ring0?
- 旧话重提:一个有50余字段的ACCESS数据表导出为一个DBASE3文件,发生错误,请斑竹等指教!
- 有没有根据已知的窗体句柄得到应用程序名和路径的!
- 请问,怎么样用VB6制做扩展名为chm的帮助文件?
WM_RBUTTONDOWN Or WM_RBUTTONUP .
但为什么?直接在 Form2 里面使用 MouseDow or MouseUp 事件不行吗?
http://www.csdn.net/expert/topic/698/698939.xml?temp=.8775141
Public Const WM_RBUTTONDOWN = &H204
Public Const HC_ACTION = 0
Public Const WM_RBUTTONUP = &H205 Declare Function SetWindowsHookEx Lib "user32" Alias _
"SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, _
ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Declare Function UnhookWindowsHookEx Lib "user32" _
(ByVal hHook As Long) As Long
Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, _
ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(lpvDest As Any, ByVal lpvSource As Long, ByVal cbCopy As Long)
'Declare Function ScreenToClient Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long
Public theForm As Form
Public hHook As Long ' handle of Hook Procedure
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Type POINTAPI
x As Long
y As Long
End Type Type MOUSEHOOKSTRUCT
pt As POINTAPI
hwnd As Long
wHitTestCode As Long
dwExtraInfo As Long
End Type
Sub EnableHook()
If hHook = 0 Then
hHook = SetWindowsHookEx(WH_MOUSE, AddressOf MouseHookProc, App.hInstance, 0)
End If
End Sub
Sub FreeHook()
Dim ret As Long
If hHook <> 0 Then
ret = UnhookWindowsHookEx(hHook)
hHook = 0
End If
End Sub
Function MouseHookProc(ByVal code As Long, ByVal wParam As Long, _
ByVal lParam As Long) As Long
If code < 0 Then
MouseHookProc = CallNextHookEx(hHook, code, wParam, lParam)
Exit Function
End If
Dim ms As MOUSEHOOKSTRUCT
CopyMemory ms, lParam, Len(ms)
If (wParam = WM_RBUTTONDOWN Or wParam = WM_RBUTTONUP) And ms.hwnd = Form2.hwnd Then
Form2.aa
Exit Function
End If
MouseHookProc = 0 '表示要处理这个讯息
Call CallNextHookEx(hHook, code, wParam, lParam)
End Function
Form2.command1.hwnd
form2.picture1.hwnd
就这样啊!
那当然就没办法了,很多VB控件是虚拟控件,没有HWND。
Option ExplicitPrivate Sub Form_Load()
Form2.Show
End Sub'form2
Option ExplicitPrivate Sub Form_Load()
InitHook1 Me.hWnd
End Sub Sub aa()
MsgBox "a", vbOKOnly, "a"
End Sub'module
Option ExplicitPrivate 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 GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPrivate Const WM_LBUTTONDOWN = &H201
Private Const WM_LBUTTONUP = &H202
Private Const WM_MOUSEMOVE = &H200
Private Const WM_RBUTTONDBLCLK = &H206
Private Const WM_RBUTTONDOWN = &H204
Private Const WM_RBUTTONUP = &H205
Private Const GWL_WNDPROC = (-4)
Private prevWndProc As LongFunction WndProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case Msg
Case WM_RBUTTONUP
MsgBox "a"
Case Else
WndProc = CallWindowProc(prevWndProc, hWnd, Msg, wParam, lParam)
End Select
End FunctionPublic Sub InitHook1(ByVal hw As Long)
prevWndProc = GetWindowLong(hw, GWL_WNDPROC)
Call SetWindowLong(hw, GWL_WNDPROC, AddressOf WndProc)
End Sub