回调程式:
Private Function WindowProc(ByVal Lwnd As Long, ByVal Lmsg As Long, ByVal Wparam As Long, ByVal Lparam As Long) As Long
Select Case Lmsg
Case WM_SETTEXT
Debug.Print Wparam
End Select
WindowProc = CallWindowProc(LocalPrevWndProc, Lwnd, Lmsg, Wparam, Lparam)
End Function这段代码可以获取大多数Window(如窗体,按钮,列表框之类的文本被改变事件),
但不知为什么不能获取菜单的消息
如我改变菜单标题: mnuFile.Caption="文件菜单" ,以上回调未执行。
但是按钮的:Command1.Caption="test"却可以正确执行.请教大家:
1.获取菜单文本(Caption)被改变,复选(Checked)被改变,可用(Enabled)被改变时的Windows消息各是什么??
2.菜单是不是一种特别的窗体,我这个回调的Hook句柄设置的是Form1.Hwnd, 是不是要设置成Menu的句柄(我测试过,不行)
Private Function WindowProc(ByVal Lwnd As Long, ByVal Lmsg As Long, ByVal Wparam As Long, ByVal Lparam As Long) As Long
Select Case Lmsg
Case WM_SETTEXT
Debug.Print Wparam
End Select
WindowProc = CallWindowProc(LocalPrevWndProc, Lwnd, Lmsg, Wparam, Lparam)
End Function这段代码可以获取大多数Window(如窗体,按钮,列表框之类的文本被改变事件),
但不知为什么不能获取菜单的消息
如我改变菜单标题: mnuFile.Caption="文件菜单" ,以上回调未执行。
但是按钮的:Command1.Caption="test"却可以正确执行.请教大家:
1.获取菜单文本(Caption)被改变,复选(Checked)被改变,可用(Enabled)被改变时的Windows消息各是什么??
2.菜单是不是一种特别的窗体,我这个回调的Hook句柄设置的是Form1.Hwnd, 是不是要设置成Menu的句柄(我测试过,不行)
看看这些消息对你有没有用处:(摘自 http://www.newasp.net/tech/program/20563.html)WM_INITMENU = $0116; 当一个菜单将要被激活时发送此消息,它发生在用户菜单条中的某项或按下某个菜单键,它允许程序在显示前更改菜单
WM_INITMENUPOPUP = $0117; 当一个下拉菜单或子菜单将要被激活时发送此消息,它允许程序在它显示前更改菜单,而不要改变全部
WM_MENUSELECT = $011F; 当用户选择一条菜单项时发送此消息给菜单的所有者(一般是窗口)
WM_MENUCHAR = $0120; 当菜单已被激活用户按下了某个键(不同于加速键),发送此消息给菜单的所有者;
WM_ENTERIDLE = $0121; 当一个模态对话框或菜单进入空载状态时发送此消息给它的所有者,一个模态对话框或菜单进入空载状态就是在处理完一条或几条先前的消息后没有消息它的列队中等待
WM_MENURBUTTONUP = $0122;
WM_MENUDRAG = $0123;
WM_MENUGETOBJECT = $0124;
WM_UNINITMENUPOPUP = $0125;
WM_MENUCOMMAND = $0126;
WM_CHANGEUISTATE = $0127;
WM_UPDATEUISTATE = $0128;
WM_QUERYUISTATE = $0129;
http://dev.csdn.net/article/34/34547.shtm
我的理解可能是这样,菜单的状态只在内存中改,不激发Windows消息,只有在打开(或弹出菜单)时才重画所有当前菜单列表项,并激发WM_INITMENU或WM_INITMENUPOPUP事件。