如何用PostMessage控制菜单?

时间:2021-10-23 12:12:07
一个项目,需要控制第三方程序的菜单。本打算用PostMessage发送WM_LBUTTONDOWN和

WM_LBUTTONUP来实现,但当打开第一层菜单后,想执行弹出的菜单项,再用这个消息就

不起作用了。

首先第三方程序的菜单不是标准的菜单,无法用GetMenu获取到主菜单项,再用

GetSubMenu获取子菜单。
第二,我可以获取到第三方程序的菜单所在的Bar的Handle(用spy++能看到,因此也可

以用FindWindowEx获取到),但仅能获取到这层,其中的菜单项无法获取到。
第三,网上都到可以不一层层打开,用WM_COMMAND消息,可是关于wParam参数的获取很

迷惑,不知道怎么得到。网上大部分都提到在资源中可以查到菜单的ID,比如用

eXescpoe软件查看。但是我的第三方程序用这个软件查看,在资源中无菜单项,还是得

不到菜单ID。另外我发现delphi生成的exe,使用的TMainMenu再资源中也没有菜单项。

烦请各路大虾给予指导,再次先说声感谢!

7 个解决方案

#1


能否 用鼠标模拟点击呢?

#2


这......Ls的方法也是没有办法的办法了,首先把目标窗体最大化,可以用消息实现,然后设定鼠标位置再模拟点击
另外模拟键盘也是可以的,用键盘tab切换再加热键也是可以实现点击菜单项的

另外有个叫UISpy.exe的东西,Lz可以看一下,能不能取到菜单的id

#3


Lz下个UISpy试试呢

#4


不能模拟鼠标点击,因为我是隐藏控制,即第三方程序在虚拟界面里

#5


利用发送键盘消息,解决了这个问题。

#6


引用 5 楼 wzn0521 的回复:
利用发送键盘消息,解决了这个问题。

楼主是怎么解决的?,应该把代码发出来共享一下

#7


参见http://bbs.csdn.net/topics/300238697
::SendMessage(hwnd,WM_COMMAND,MAKEWPARAM(XXXX,BN_CLICKED),NULL);
hwnd是菜单所在窗体的hwnd
 XXXX可以是菜单标识如数字123,也可以是菜单的ID_XXXX这样的形式

 如果是ID_XXX的形式需要详细的进行预定义 

#1


能否 用鼠标模拟点击呢?

#2


这......Ls的方法也是没有办法的办法了,首先把目标窗体最大化,可以用消息实现,然后设定鼠标位置再模拟点击
另外模拟键盘也是可以的,用键盘tab切换再加热键也是可以实现点击菜单项的

另外有个叫UISpy.exe的东西,Lz可以看一下,能不能取到菜单的id

#3


Lz下个UISpy试试呢

#4


不能模拟鼠标点击,因为我是隐藏控制,即第三方程序在虚拟界面里

#5


利用发送键盘消息,解决了这个问题。

#6


引用 5 楼 wzn0521 的回复:
利用发送键盘消息,解决了这个问题。

楼主是怎么解决的?,应该把代码发出来共享一下

#7


参见http://bbs.csdn.net/topics/300238697
::SendMessage(hwnd,WM_COMMAND,MAKEWPARAM(XXXX,BN_CLICKED),NULL);
hwnd是菜单所在窗体的hwnd
 XXXX可以是菜单标识如数字123,也可以是菜单的ID_XXXX这样的形式

 如果是ID_XXX的形式需要详细的进行预定义