如何使用 PostMessage/SendMessage User32 单击菜单项

Posted

技术标签:

【中文标题】如何使用 PostMessage/SendMessage User32 单击菜单项【英文标题】:How to click on Menu items with PostMessage/SendMessage User32 【发布时间】:2014-10-24 20:43:44 【问题描述】:

您好,我有 Windows 应用程序,我需要在菜单/选项卡项目上单击一个。我可以找到包含所有选项、文件、帮助....选项卡的菜单,但我找不到获取方法到我的项目。

我无法发送我的应用程序的图片,但我将发送与 IE 相同的示例/逻辑,我需要点击希腊语(ios)。

1.我需要点击查看

2.悬停编码

3.Hover 更多

和 4. 点击希腊语(IOS)。

我可以找到带有文件、教育、视图、工具、帮助的全栏菜单

intWhdr = FindWindow(Step1Window.Class, Step1Window.Name);//Program 
currChild = FindWindowEx(intWhdr, 0, "WindowsForms10.Window.", "mainMenu");//Menu

这里我有我的主菜单,在这里我卡住了我找不到按菜单项的方式(例如在 Ie 示例中)查看菜单。 我什至不需要悬停动作,我可以使用 SendMessage DownArrow 和 RightArrow 来访问我的项目,但我需要先点击查看。

任何想法如何点击查看菜单表单菜单栏?使用 SendMessage/PostMessage

更新

【问题讨论】:

【参考方案1】:

使用 spy++ 跟踪传递到菜单栏的所有事件,然后尝试从您的程序重新发送消息。

【讨论】:

我发现了这个事件(见更新),我认为你好正在按下菜单项,但我真的不知道如何在代码中使用它。 使用消息、lparam、wparam 和窗口句柄调用 sendmessage API。 我试过但 wParam =011C16A8 和 handle=011C16A8 不是 IntPtr 或 Int sow 我不能使用 sendmessage,我不知道可以与 011C16A8 一起使用的 sendmessage(我不知道那是什么格式)【参考方案2】:

经过长期研究并在 dvasanth 的帮助下,我找到了解决办法

1.你需要像img那样找到WM_LBUTTONUP/DOWN NOT WM_SETCURSOR,然后打开属性找到wParam和lParam

2.更改格式011C16A8只需添加0x+lParam/wParam

例如:011C16A8 = 0x011C16A8

EX: 00000001= 0x01

EX: 00000012=0x12

我想我有一个想法......

就我而言,我在属性中找到:

WM_LBUTTONUP

lParam=00000001
wParam=000C0348

WM_LBUTTONDOWN

lParam=00000000
wParam=000C0348

编辑后播种,它们看起来像这样:

WM_LBUTTONUP

lParam=0x01
wParam=0x000C0348

WM_LBUTTONDOWN

 lParam=0x00
 wParam=0x000C0348

3.只需将其插入到您的代码中即可。

我的代码有效:

intRes1 = PostMessage(currChild, WM_LBUTTONDOWN, 0x01, 0x000C0348);
System.Threading.Thread.Sleep(100);
intRes1 = PostMessage(currChild, WM_LBUTTONUP, 0x00, 0x000C0348);

【讨论】:

以上是关于如何使用 PostMessage/SendMessage User32 单击菜单项的主要内容,如果未能解决你的问题,请参考以下文章

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?

WSARecv 如何使用 lpOverlapped?如何手动发出事件信号?