zoukankan      html  css  js  c++  java
  • 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条横线

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

  • 相关阅读:
    千年不曾看懂《道德经》,直至有了《道德图》!--作者:南山空同
    初探工作流的库表设计
    教你如何快速上手markdown语法,编写技术博客(史上最全最简,用MarkDown写博客)
    面试官:你连RESTful都不知道我怎么敢要你? 文章解析
    Dapper系列 作者:懒懒的程序员一枚
    为何要编写《元灵心经》养、和、消三篇 作者 南山空同
    南山空同《学经》前24章
    ASP.NET Core 2.2 WebApi 系列【九】使用SignalR (作者:tenghao510 ) 学习及内容补充
    Net Core 中WebAPI有关 Session的设置,及获取
    asp.net core系列 WebAPI 作者:懒懒的程序员一枚
  • 原文地址:https://www.cnblogs.com/darkspr/p/9868761.html
Copyright © 2011-2022 走看看