得知目前Mouse所指的MenuItem是哪一个
2018-06-17 17:11:50来源:未知 阅读 ()
档案编辑选项-->hMenu(功能表,Menu)
-------
|复制|--------->hSubMenu(子功能表,SubMenu)
|贴上|
|减下------------->MenuID(功能表项目,MenuItem)
||
-------
所以了,这就得使用SubClass的技巧,取得WM_MENUSELECT的Message,进而得知到底是选到了哪一个MenuItem。当然了,我们可以使用GetMenuGetSubMenuGetMenuItemID等API来得知功能表上每一个项目的hMenuhSubMenuMenuID,如此一来,和WM_MENUSELECT讯息所取得的lParamwParam做做比较,就可得知到底选上了哪一个,而本例则是使用GetMenuString取得MenuItem的title,如果您的MenuItems没有相同的title,也不失一得知方式。
'以下在form,请自行加Menu於Form上
PrivateSubForm_Load()
DimretAsLong
hMenu=GetMenu(Me.hwnd)
'记录原本的WindowProcedure的位址
preWinProc=GetWindowLong(Me.hwnd,GWL_WNDPROC)
'设定Combo1的windowProcedure到wndproc
ret=SetWindowLong(Me.hwnd,GWL_WNDPROC,AddressOfwndproc)
EndSub
PrivateSubForm_Unload(CancelAsInteger)
DimretAsLong
'取消Message的截取,而使之又只送往原来的WindowProcedure
ret=SetWindowLong(Me.hwnd,GWL_WNDPROC,preWinProc)
EndSub
'以下在.Bas
'以下程式在module1.bas
DeclareFunctionSetWindowLongLib"user32"Alias"SetWindowLongA"_
(ByValhwndAsLong,ByValnIndexAsLong,ByValdwNewLongAsLong)AsLong
DeclareFunctionGetWindowLongLib"user32"Alias"GetWindowLongA"_
(ByValhwndAsLong,ByValnIndexAsLong)AsLong
DeclareFunctionCallWindowProcLib"user32"Alias"CallWindowProcA"_
(ByVallpPrevWndFuncAsLong,ByValhwndAsLong,ByValMsgAsLong,_
ByValwParamAsLong,ByVallParamAsLong)AsLong
DeclareFunctionGetMenuStringLib"user32"Alias"GetMenuStringA"(ByValhMenuAsLong,ByValwIDItemAsLong,ByVallpStringAsString,ByValnMaxCountAsLong,ByValwFlagAsLong)AsLong
DeclareFunctionGetMenuLib"user32"(ByValhwndAsLong)AsLong
DeclareFunctionGetSubMenuLib"user32"(ByValhMenuAsLong,ByValnPosAsLong)AsLong
PublicConstGWL_WNDPROC=(-4)
PublicConstWM_MENUSELECT=&H11F
PublicConstMF_BYCOMMAND=&H0&
PublicConstMF_BYPOSITION=&H400&
PublichMenuAsLong
PublicpreWinProcAsLong
PrivateTypetLong
llAsLong
EndType
PrivateTypeTwoWord
LowWordAsInteger
HiWordAsInteger
EndType
PublicFunctionwndproc(ByValhwndAsLong,ByValMsgAsLong,_
ByValwParamAsLong,ByVallParamAsLong)AsLong
DimMenuItemStrAsString,SubMenuStrAsString
DimhSubmenuAsLong,MenuIdAsLong,iAsLong
DimtmplAstLong,tmptAsTwoWord
'以下程式会截取WM_MENUSELECT处理完後,再将之送往原来的WindowProcedure
IfMsg=WM_MENUSELECTThen
SubMenuStr=String(255,0)
MenuItemStr=String(255,0)
tmpl.ll=wParam
LSettmpt=tmpl
MenuId=tmpt.LowWord
hSubmenu=GetSubMenu(lParam,MenuId)
IfhSubmenu=0Then'表示该item之下没有popupMenu了
CallGetMenuString(lParam,MenuId,MenuItemStr,256,MF_BYCOMMAND)
MenuItemStr=Left(MenuItemStr,InStr(1,MenuItemStr,Chr(0))-1)
Debug.Print"正在MenuItem" MenuItemStr
Else
CallGetMenuString(hMenu,hSubmenu,SubMenuStr,256,MF_BYCOMMAND)
SubMenuStr=Left(SubMenuStr,InStr(1,SubMenuStr,Chr(0))-1)
Debug.Print"正在PopUpMenu" SubMenuStr
EndIf
EndIf
'将之送往原来的WindowProcedure
wndproc=CallWindowProc(preWinProc,hwnd,Msg,wParam,lParam)
EndFunction->
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:用VB实现图像切换效果
下一篇:如何用VB设计动画时钟举例
- 如何自动移动Mouse 2018-06-17
- 怎样用VB得知系统当前是否处于internet链结状态 2018-06-17
- VB中如何实现文本查找功能 2018-06-17
- 捕捉MouseExit事件 2018-06-17
- VB与大型数据库无数据源的连接 2018-06-17
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash