前言
(下面展示一部分代码,全部放在百度网盘上去了,最底下附上链接)
用到工具主要有VS自带的SPY++工具
下面以抓取这四个软件软件中的按钮和菜单并单击作为实验对象
抓取"STM32 ST-LINK Utility" 的"Traget"菜单中的子菜单 "Connect"。
我们从Spy++工具抓取的结果可以看出,并没有抓取到"Traget"菜单的句柄。
查了不少资料,也问了不少大佬,下面提供一直方法可以顺利找到菜单的句柄并,并操作对应的子菜单(标注有详细注释)
const int WM_COMMAND = 0x0111;
const int MF_BYCOMMAND = 0x00000000;
const int MAX_MENU_STRING_LENGTH = 256;
// 找到主窗体句柄
IntPtr stmHandle = FindWindow(null, "STM32 ST-LINK Utility");
SetForegroundwindow(stmHandle);
//拿到了菜单句柄
IntPtr po = GetMenu(stmHandle);
// 菜单数量是不是7个
int count = GetMenuItemCount(po);//7个菜单
//拿到页面菜单中的额 Traget
IntPtr submenuHandle = GetSubMenu(po, 3);
textBox3.Text = submenuHandle.ToString();
//统计Traget中子菜单个数
int count1 = GetMenuItemCount(submenuHandle);
// 获取子菜单项ID
uint openFileMenuItemId = GetMenuItemID(submenuHandle, Convert.ToInt32 (8));
textBox2.Text = openFileMenuItemId.ToString ();
// 获取子菜单名称
StringBuilder sb = new StringBuilder(MAX_MENU_STRING_LENGTH);
int length = GetMenuString(submenuHandle, openFileMenuItemId, sb, MAX_MENU_STRING_LENGTH, MF_BYCOMMAND);
string menuName = sb.ToString(0, length);
textBox1.Text = menuName;
// 模拟单击子菜单项
try
{
SendMessage(stmHandle, WM_COMMAND, new IntPtr(openFileMenuItemId), IntPtr.Zero);
}
catch (Exception ex) { }
2.抓取"Renesas Flash Programmer V2.05"的"Start"按钮并点击。
抓取这个就比较简单了,因为从Spy++工具抓取来看能抓取到"Start"按钮的句柄
3.抓取"ProWriter","加载工程"按钮并单击。
抓取这个就要注意了因为一级主窗体下面有三个主菜单对话框
我们要找的"加载工程"按钮的信息在第一个子菜单里面
要拿到按钮的句柄就先指定按钮所在的窗体是哪一个
最后附上链接:
百度云:
链接:https://pan.baidu.com/s/10HSWbjRvQ5YqjSH7kxLN5A?pwd=6666
提取码:6666