最近接到一个活,要求定时点击一个软件的某个菜单按钮,刷新并保存文件python
按照以前的作法,就是直接控制鼠标,定位到相应位置进行点击函数
不过此次,准备作的更专业化一点,不要那么原始测试
主要用到的函数都是win32gui下面的,毕竟都是界面操做ui
#查找窗口句柄 win32gui.FindWindow() #查找指定窗口的菜单 win32gui.GetMenu() #查找某个菜单的子菜单 win32gui.GetSubMenu() #得到子菜单的ID win32gui.GetMenuItemID() #得到某个子菜单的内容 win32gui.GetMenuItemInfo() #给句柄发送通知(点击事件) win32gui.PostMessage()
1,首先获取到窗口的句柄,根据窗口标题便可获取3d
2,得到窗口菜单的句柄code
3,得到某个子菜单的句柄blog
4,得到子菜单的ID事件
5,点击这个菜单get
完整代码以下cmd
import win32gui window_name = u'xxxx' hwnd = win32gui.FindWindow(None, window_name) menu = win32gui.GetMenu(hwnd) menu1 = win32gui.GetSubMenu(menu, 1)#第几个菜单 cmd_ID = win32gui.GetMenuItemID(menu1, 1)#第几个子菜单 win32gui.PostMessage(hwnd, win32con.WM_COMMAND, cmd_ID, 0)
menu1 就是第几个menu,后面参数0就是第一个,file,相应的1就是edit
cmd_id 就是子菜单的id,好比new display... 就是0,第一个子菜单,以此类推
不过实际操做下来,有些问题
主要是不知道菜单的内容,有的菜单点击了不知道有没有点击成功
因此须要获取子菜单的内容,这样就能知道点击的对不对了
首先看下这个菜单下红色部分是第几个子菜单,通常会说6,由于总共6个选项,其实应该是9
缘由是3条横线也算子菜单
这里找了下,发现有个函数能够提供这个标题内容
win32gui.GetMenuItemInfo()
通过网上的查找,找到了使用方法以下
#获取某个菜单的内容 def get_menu_item_txt(menu,idx): import win32gui_struct mii, extra = win32gui_struct.EmptyMENUITEMINFO() #新建一个win32gui的空的结构体mii win32gui.GetMenuItemInfo(menu, idx, True, mii) #将子菜单内容获取到mii ftype, fstate, wid, hsubmenu, hbmpchecked, hbmpunchecked,\ dwitemdata, text, hbmpitem = win32gui_struct.UnpackMENUITEMINFO(mii) #解包mii return text
大概意思就是这个函数返回的是一个结构体,要用他提供的方法来得到这个结构体,而后在解包这个结构体就能得到标题了
for i in range(5): print get_menu_item_txt(menu,i) >>> &File &Edit &Simulation &Window &Help for i in range(9): print get_menu_item_txt(menu1,i) >>> &Undo Ctrl+Z Cu&t Ctrl+X &Copy Ctrl+C &Paste Ctrl+V C&lear Refresh
测试了几回,能够看到获取菜单时能够看到是5个,获取edit的子菜单时,refresh是第9个菜单,中奖有3条空行,对应就是3条横线
这样就完成了此次的任务,不须要再用鼠标点击这些按钮,直接发送消息过去就等于点击按钮了,这样就没不影响操做了