【问题标题】:Python pywinauto search windows with partial title带有部分标题的 Python pywinauto 搜索窗口
【发布时间】:2021-02-27 05:50:34
【问题描述】:

有什么方法可以让pywinauto找到一个只有部分标题的窗口?

这是我的代码:

import pywinauto

pwa_app = pywinauto.application.Application()
w_handle = pywinauto.findwindows.find_windows(title=u'Minitab Professional 5.1 64bit - 3333348.temp.project',
                                              class_name='Window')[0]

问题是每次打开软件时temp.project之前的数字都会改变,因此我无法让pywinauto找到正确的窗口。

【问题讨论】:

    标签: python pywinauto


    【解决方案1】:

    通过浏览google code 上的源代码,我看到您可以为标题提供正则表达式:

    #=========================================================================
    def find_windows(class_name = None,
                    class_name_re = None,
                    parent = None,
                    process = None,
                    title = None,
                    title_re = None,
                    top_level_only = True,
                    visible_only = True,
                    enabled_only = False,
                    best_match = None,
                    handle = None,
                    ctrl_index = None,
                    predicate_func = None,
                    active_only = False,
                    control_id = None,
        ):
        """Find windows based on criteria passed in
    
        Possible values are:
    
        * **class_name**  Windows with this window class
        * **class_name_re**  Windows whose class match this regular expression
        * **parent**    Windows that are children of this
        * **process**   Windows running in this process
        * **title**     Windows with this Text
        * **title_re**  Windows whose Text match this regular expression
        * **top_level_only** Top level windows only (default=True)
        * **visible_only**   Visible windows only (default=True)
        * **enabled_only**   Enabled windows only (default=True)
        * **best_match**  Windows with a title similar to this
        * **handle**      The handle of the window to return
        * **ctrl_index**  The index of the child window to return
        * **active_only**  Active windows only (default=False)
        * **control_id**  Windows with this control id
       """
    

    根据我的说法pywinauto.findwindows.find_windows(title_re = r'Minitab Professional 5.1 64bit*', class_name='Window')[0] 应该可以工作。

    【讨论】:

    • 不应该是.*或类似的吗?它可以用作通配符还是 Python 正则表达式?
    • 我的正则表达式有点生锈,所以你可能是对的。信任,但要验证。
    【解决方案2】:

    title_re 用作 Python 正则表达式。在您的情况下,它应该类似于 title_re=u'Minitab Professional 5\.1 64bit - \d+\.temp\.project'

    \. 表示点符号,. 表示任何符号。

    对于功能齐全的对话框包装器(而不是句柄),以下事情更简单:

    dlg = pwa_app.Window_(title_re=u'Minitab Professional 5\.1 64bit - \d+\.temp\.project', class_name='Window')
    

    它使用正确的 process 参数(这是 pid)调用 find_window,因此您不会被来自多个应用实例的许多相似窗口混淆。

    顺便说一句,对于 64 位应用程序,您需要 64 位兼容的 pywinauto 克隆(官方 0.4.2 仅支持 32 位 Python 和应用程序,因为不同的 WinAPI 结构对齐方式)。

    【讨论】:

    【解决方案3】:

    这种情况下最好通过路径连接App,比如:

    app = application.Application(backend="uia")
    app.connect(path = r"C:/Program Files/iTunes/iTunes.exe")
    

    【讨论】:

      【解决方案4】:

      使用best_match,不需要正则表达式:

      handle = pywinauto.findwindows.find_window(best_match='Minitab')
      app = pywinauto.application.Application().connect(handle=handle)
      

      或更短:

      app = pywinauto.application.Application().connect(best_match='Minitab')
      

      【讨论】:

        【解决方案5】:

        这是 pyautogui 的另一个解决方案: 我们将通过部分标题找到一个窗口,然后将其关闭。

        import pyautogui
        win = [w for w in pyautogui.getAllWindows() if 'your window partial title' in w.title]
        if len(win)>0:
            win[0].close()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-20
          • 1970-01-01
          • 2013-05-28
          相关资源
          最近更新 更多