Option ExplicitPrivate Sub Form_Load() hMenu = GetMenu(Me.hwnd) PrevWndProc = GetWindowLong(Me.hwnd, GWL_WNDPROC) SetWindowLong Me.hwnd, GWL_WNDPROC, AddressOf SubWndProc End Sub'in a module Option ExplicitPublic Declare Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long Public Declare Function CallWindowProc Lib "user32.dll" 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.dll" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Public Declare Function GetMenu Lib "user32.dll" (ByVal hwnd As Long) As Long Public Declare Function GetMenuString Lib "user32.dll" Alias "GetMenuStringA" (ByVal hMenu As Long, ByVal wIDItem As Long, ByVal lpString As String, ByVal nMaxCount As Long, ByVal wFlag As Long) As LongPublic Const GWL_WNDPROC As Long = -4 Private Const WM_COMMAND As Long = &H111Public PrevWndProc As Long Public hMenu As LongPublic Function SubWndProc(ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Dim menuCaption As String Dim length As Long
If msg = WM_COMMAND Then menuCaption = String(256, Chr(0)) length = GetMenuString(hMenu, wParam, menuCaption, Len(menuCaption), 0&) Debug.Print Left$(menuCaption, length) End If SubWndProc = CallWindowProc(PrevWndProc, hwnd, msg, wParam, lParam)
这些click事件不仅仅你首次点击菜单回出发,当你开着一个菜单在菜单条上来回移动鼠标时都会出发各自的click事件,非常方便。注意
有子菜单的菜单(比如主菜单)的事件编写法不是通过双击那个菜单来实现的而是要到代码编辑器里通过选择上面的两个下拉列表框来得到
我现在想要只写一个函数(过程)就可以解决这问题
还望赐教!
用API可以实现吗?
谁给我说说啊
hMenu = GetMenu(Me.hwnd)
PrevWndProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
SetWindowLong Me.hwnd, GWL_WNDPROC, AddressOf SubWndProc
End Sub'in a module
Option ExplicitPublic Declare Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Public Declare Function CallWindowProc Lib "user32.dll" 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.dll" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function GetMenu Lib "user32.dll" (ByVal hwnd As Long) As Long
Public Declare Function GetMenuString Lib "user32.dll" Alias "GetMenuStringA" (ByVal hMenu As Long, ByVal wIDItem As Long, ByVal lpString As String, ByVal nMaxCount As Long, ByVal wFlag As Long) As LongPublic Const GWL_WNDPROC As Long = -4
Private Const WM_COMMAND As Long = &H111Public PrevWndProc As Long
Public hMenu As LongPublic Function SubWndProc(ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim menuCaption As String
Dim length As Long
If msg = WM_COMMAND Then
menuCaption = String(256, Chr(0))
length = GetMenuString(hMenu, wParam, menuCaption, Len(menuCaption), 0&)
Debug.Print Left$(menuCaption, length)
End If
SubWndProc = CallWindowProc(PrevWndProc, hwnd, msg, wParam, lParam)
End Function
除非你要在拦截移动项目的事件才需要用到嘿嘿 用了子类调试的时候等着vb挂掉吧