我试图让 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
如果我在按钮激活后启动它运行,按预期单击并打印"单击",这将正常工作。如果我在按钮处于活动状态之前运行它,它会按预期等待它,然后似乎尝试单击它 - 反复打印"单击",直到我单击鼠标按钮或按 Enter 键。如果我取出 click(( 并让它只返回应用程序。允许 然后无论我何时加载脚本,结果都是预期的,所以它似乎是 click(( 挂断。
无论我在哪里单击或我激活了哪个窗口,行为都是相同的 - 如果我单击任何地方或任何东西,它都会起作用,但在我这样做之前它根本不会做任何事情......这真的破坏了自动化的对象!
有什么想法吗?
谢谢!
首先,如果您使用.connect(...)
,则必须以管理员身份运行脚本。我已经在目标进程具有更高权限时在.click()
方法中添加了有关此和错误的警告。请参阅拉取请求 #499。它将被包含在即将到来的pywinauto==0.6.5中。
还有一种方法:.click_input()
移动鼠标光标并执行真正的点击。虽然.click()
只是发送WM_CLICK
窗口消息(可能对最小化或非活动窗口有用(。
附言顺便说一下,对于Outlook,我建议使用Application(backend="uia")
,你不会遇到Win32 API特定的问题。请参阅入门指南,了解后端的区别。