python windows軟件窗口menu操作 pywin32庫


最近接到一個活,要求定時點擊一個軟件的某個菜單按鈕,刷新並保存文件

 

按照之前的做法,就是直接控制鼠標,定位到相應位置進行點擊

不過這次,准備做的更專業化一點,不要那么原始

主要用到的函數都是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條橫線

這樣就完成了這次的任務,不需要再用鼠標點擊這些按鈕,直接發送消息過去就等於點擊按鈕了,這樣就沒不影響操作了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM