当前位置:   article > 正文

python windows 窗口_python windows软件窗口menu操作 pywin32库

python实现点击应用窗口的子菜单

最近接到一个活,要求定时点击一个软件的某个菜单按钮,刷新并保存文件

按照之前的做法,就是直接控制鼠标,定位到相应位置进行点击

不过这次,准备做的更专业化一点,不要那么原始

主要用到的函数都是win32gui下面的,毕竟都是界面操作

#查找窗口句柄

win32gui.FindWindow()

#查找指定窗口的菜单

win32gui.GetMenu()

#查找某个菜单的子菜单

win32gui.GetSubMenu()

#获得子菜单的ID

win32gui.GetMenuItemID()

#获得某个子菜单的内容

win32gui.GetMenuItemInfo()

#给句柄发送通知(点击事件)

win32gui.PostMessage()

1,首先获取到窗口的句柄,根据窗口标题即可获取

2,获得窗口菜单的句柄

3,获得某个子菜单的句柄

4,获得子菜单的ID

5,点击这个菜单

完整代码如下

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条横线

这样就完成了这次的任务,不需要再用鼠标点击这些按钮,直接发送消息过去就等于点击按钮了,这样就没不影响操作了

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/109197
推荐阅读
相关标签
  

闽ICP备14008679号