用API模拟点击PopupMenu里的按钮 ( 积分: 150 )

  • 主题发起人 主题发起人 yeaphi
  • 开始时间 开始时间
Y

yeaphi

Unregistered / Unconfirmed
GUEST, unregistred user!
我的程序主form里使用的菜单是toolbar + popupmenu,而不是使用mainmenu,我想用api函数来获得这个popupmenu,并且把菜单组成一棵树保存到数据库里,下面FindMenu就是我用来获取popupmenu的,为什么这里的SendNotifyMessage(self.Handle, WM_COMMAND, ChildId, 0)模拟点击某个按钮不能成功呢?如果换成了mainmenu就可以了,我怀疑这和popupmenu有关,于是我用popupmenu.popup(0, 0)先弹出菜单,再sendmessage,可以依然无效,请朋友们帮我看看。<br>function TmainFrm.FindMenu(MenuHnd:integer):boolean;<br>var<br> &nbsp;MenuNum, MenuId, ChildHnd, ChildNum, ChildId : integer ;<br> &nbsp;i, j, ErrCode : integer;<br> &nbsp;MenuStr, ChildStr : String;<br> &nbsp;Res : boolean;<br> &nbsp;MenuInfo : MENUITEMINFO;<br> &nbsp;TypeData : Array [0..50] of char;<br> &nbsp;BtnHnd : HWND;<br> &nbsp;lpPoint:TPoint;<br>begin<br> &nbsp;MenuNum := GetMenuItemCount(MenuHnd);<br> &nbsp;for i:=0 to MenuNum-1 do<br> &nbsp;begin<br> &nbsp; &nbsp;MenuStr := StringOfChar(' ', 255);<br> &nbsp; &nbsp;ChildHnd := GetSubMenu(MenuHnd, i);<br> &nbsp; &nbsp;ChildNum := GetMenuItemCount(ChildHnd);<br> &nbsp; &nbsp;GetMenuString(MenuHnd, i, PChar(MenuStr), 255, MF_BYPOSITION);<br> &nbsp; &nbsp;Memo1.Lines.Add(MenuStr);<br> &nbsp; &nbsp;if ChildHnd &lt;&gt; 0 then<br> &nbsp; &nbsp;begin<br> &nbsp; &nbsp; &nbsp;for j:=0 to ChildNum-1 do<br> &nbsp; &nbsp; &nbsp;begin<br> &nbsp; &nbsp; &nbsp; &nbsp;ChildStr := StringOfChar(' ', 255);<br> &nbsp; &nbsp; &nbsp; &nbsp;GetMenuString(ChildHnd, j, PChar(ChildStr), 20, MF_BYPOSITION);<br> &nbsp; &nbsp; &nbsp; &nbsp;ChildId := GetMenuItemId(ChildHnd, j);<br> &nbsp; &nbsp; &nbsp; &nbsp;SendNotifyMessage(self.Handle, WM_COMMAND, ChildId, 0);<br> &nbsp; &nbsp; &nbsp;end;<br> &nbsp; &nbsp;end;<br> &nbsp;end;<br>end;
 
我的程序主form里使用的菜单是toolbar + popupmenu,而不是使用mainmenu,我想用api函数来获得这个popupmenu,并且把菜单组成一棵树保存到数据库里,下面FindMenu就是我用来获取popupmenu的,为什么这里的SendNotifyMessage(self.Handle, WM_COMMAND, ChildId, 0)模拟点击某个按钮不能成功呢?如果换成了mainmenu就可以了,我怀疑这和popupmenu有关,于是我用popupmenu.popup(0, 0)先弹出菜单,再sendmessage,可以依然无效,请朋友们帮我看看。<br>function TmainFrm.FindMenu(MenuHnd:integer):boolean;<br>var<br> &nbsp;MenuNum, MenuId, ChildHnd, ChildNum, ChildId : integer ;<br> &nbsp;i, j, ErrCode : integer;<br> &nbsp;MenuStr, ChildStr : String;<br> &nbsp;Res : boolean;<br> &nbsp;MenuInfo : MENUITEMINFO;<br> &nbsp;TypeData : Array [0..50] of char;<br> &nbsp;BtnHnd : HWND;<br> &nbsp;lpPoint:TPoint;<br>begin<br> &nbsp;MenuNum := GetMenuItemCount(MenuHnd);<br> &nbsp;for i:=0 to MenuNum-1 do<br> &nbsp;begin<br> &nbsp; &nbsp;MenuStr := StringOfChar(' ', 255);<br> &nbsp; &nbsp;ChildHnd := GetSubMenu(MenuHnd, i);<br> &nbsp; &nbsp;ChildNum := GetMenuItemCount(ChildHnd);<br> &nbsp; &nbsp;GetMenuString(MenuHnd, i, PChar(MenuStr), 255, MF_BYPOSITION);<br> &nbsp; &nbsp;Memo1.Lines.Add(MenuStr);<br> &nbsp; &nbsp;if ChildHnd &lt;&gt; 0 then<br> &nbsp; &nbsp;begin<br> &nbsp; &nbsp; &nbsp;for j:=0 to ChildNum-1 do<br> &nbsp; &nbsp; &nbsp;begin<br> &nbsp; &nbsp; &nbsp; &nbsp;ChildStr := StringOfChar(' ', 255);<br> &nbsp; &nbsp; &nbsp; &nbsp;GetMenuString(ChildHnd, j, PChar(ChildStr), 20, MF_BYPOSITION);<br> &nbsp; &nbsp; &nbsp; &nbsp;ChildId := GetMenuItemId(ChildHnd, j);<br> &nbsp; &nbsp; &nbsp; &nbsp;SendNotifyMessage(self.Handle, WM_COMMAND, ChildId, 0);<br> &nbsp; &nbsp; &nbsp;end;<br> &nbsp; &nbsp;end;<br> &nbsp;end;<br>end;
 
没人能帮帮我?<br>热切期待中……
 
当然是不行的,popupmenu 的消息是在 通过popupWindow 处理的,你看看popupmenu的源代码就知道
 
那就没办法了吗?<br>如果不能用程序获取菜单的话,那只能手工写到数据库中,那就太麻烦了。
 
好,帮你研究下这个问题。
 
要将菜单写数据库里,需要这么复杂吗???要摸拟点击它干嘛呢???
 
在问问为什么要用sendmessage的方式模拟点击?
 
如果方便的话请给个比较完整的代码,我不知道怎么用你这段代码,然后帮你调吧
 
那请问还有什么方式可以模拟点击?<br>我用sendmessage来模拟进入每个窗口,是为了遍历系统里所有的菜单和按钮
 
水平比较菜,没搞太懂你的调用方法,我可能会用鼠标移动和鼠标点击的方式模拟
 
最近比较忙,一直没上来,对不起大家了<br>看来这分只能三个人分了<br>后来的程序我已经没有这样做了,可能像XUXIAOHAN说的那样,popupmenu不能这样做吧
 
多人接受答案了。
 
后退
顶部