【问题标题】:PyWinAuto: Click() fails until mouse is physically clickedPyWinAuto:Click() 失败,直到鼠标被物理点击
【发布时间】:2018-11-13 21:34:53
【问题描述】:

我正在尝试让 PyWinAuto 在启用后立即单击按钮。这是我目前拥有的:

while running:
        try:
            app = pywinauto.Application().connect(title='Microsoft Outlook', class_name="#32770")['Microsoft Outlook']
            app.Allow.Wait('ready', retry_interval=0.1)
            app.Allow.Click()
            print('Clicked')


        except (pywinauto.findbestmatch.MatchError, pywinauto.findwindows.ElementNotFoundError):
            time.sleep(0.1)
            pass

如果我在按钮处于活动状态、单击并按预期打印“已单击”后启动它运行,则效果很好。如果我在按钮处于活动状态之前运行它,它会按预期等待它,然后似乎 try 并单击它 - 反复打印“单击”,直到我单击鼠标按钮或按 Enter 键。如果我取出 click() 并让它只返回 app.Allow ,那么无论我何时加载脚本,结果都是预期的,所以它似乎是 click() 这就是挂断。

无论我在哪里单击或激活哪个窗口,行为都是相同的 - 如果我单击任何地方或任何东西,它就会起作用,但在我这样做之前它不会做任何事情......这会破坏对象真正的自动化!

有什么想法吗?

谢谢!

【问题讨论】:

    标签: python pywinauto


    【解决方案1】:

    如果您使用.connect(...),首先您必须以管理员身份运行脚本。当目标进程具有更高的权限时,我已经在.click() 方法中添加了关于此的警告和错误。见pull request #499。它将包含在即将到来的 pywinauto==0.6.5 中。

    还有一种方法:.click_input() 移动鼠标光标并执行真正的点击。而.click() 只是发送WM_CLICK 窗口消息(可能对最小化或非活动窗口有用)。

    附:顺便说一句,对于 Outlook,我建议使用 Application(backend="uia"),这样您就不会遇到 Win32 API 特定的问题。请参阅Getting Started Guide 了解后端差异。

    【讨论】:

    • 干杯瓦西里,但我并没有更进一步。我已经以管理员身份运行脚本,并且看到了相同的症状,并且我故意使用 w32 后端 - 尽管提示标记为“Microsoft Outlook”,但它不包含在 Outlook 本身中,并且它是我的遗留提示'正试图点击离开。 click_input() 根本不适用于最小化或非活动窗口,是吗?这是我改用 click() 方法的主要原因。
    • 是的,click_input() 需要活动窗口。根本原因可能在应用程序端的 WM_CLICK 消息处理程序中。作为一种解决方法,您可以在 .click() 之前尝试 .send_chars(“{ENTER}”)。
    • send_chars/type_keys 的区别与 click/click_input 的区别相同。
    • 尝试了 send_chars 解决方法,仍然没有骰子 - 即使使用 {ENTER} 输入,它也一直卡住,直到我在前进之前单击。诡异的。不过,感谢您的想法,我可能会看看是否可以将其考虑到不同的方法中。无论如何,这是明天的工作。
    • 我的意思不是 WM_LBUTTONDOWN/WM_CLICK 处理程序本身,而是启用此处理程序的代码。它可能会在一些触发器后运行。可能是应用程序问题/错误?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 1970-01-01
    • 2013-11-17
    • 2012-04-30
    • 1970-01-01
    • 2012-06-01
    • 2017-05-25
    相关资源
    最近更新 更多