最近接到一個活,要求定時點擊一個軟件的某個菜單按鈕,刷新並保存文件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條橫線
這樣就完成了此次的任務,不須要再用鼠標點擊這些按鈕,直接發送消息過去就等於點擊按鈕了,這樣就沒不影響操做了