如果窗口存在于背景中或前面,则使用AutoIt单击控件

时间:2013-07-16 12:17:54

标签: automation autoit

我想点击EXE文件表单上的按钮。

以下是我尝试过的代码。

WinWaitActive("ABCD")
ControlClick("ABCD","Defer","[CLASS:Button; INSTANCE:2]")
Run("ClickDefer.exe")
  • 第一行WinWaitActive("ABCD")等待名为 ABCD 的窗口成为焦点。
  • 第二行点击按钮推迟
  • 第三行运行相同的EXE文件,以便在发生时处理相同的情况。

如果 ABCD 窗口成为焦点,这将正常工作。如果不是焦点则不起作用。我该如何克服这个问题?

3 个答案:

答案 0 :(得分:5)

好吧,你应该使用无限循环而不是一遍又一遍地运行相同的编译脚本。并且JonBecher是对的,但是错过了案例,窗口永远不会变得活跃。所以你的解决方案是:

While True
    $win = WinWait("ABCD", "Defer")
    ControlClick($win, "", "[CLASS:Button; INSTANCE:2]")
    WinWaitClose($win)
Wend

这意味着,您的点击将关闭窗口,并且您希望等待同一窗口在将来再次显示。否则你的完整意图Run(...) - 电话没有意义。

使用ControlClick(...),您无需让窗口处于活动状态,甚至不可见。

答案 1 :(得分:2)

使用WinActivate可以让窗口成为​​焦点。

WinActivate("ABCD")

这将把焦点带到“ABCD”窗口。

WinWaitActive("ABCD")
WinActivate("ABCD")
ControlClick("ABCD","Defer","[CLASS:Button; INSTANCE:2]")
Run("ClickDefer.exe")

答案 2 :(得分:0)

如果您发送控制键,则无需等待或关注该窗口。它会处理......我正在为Skype sso编写这段代码,无论窗口在哪里......如果窗口最小化,它就可以工作。

#include <WinAPI.au3>
$pId = Run("C:/Program Files (x86)/Skype/Phone/Skype.exe")

Local $hWnd = WinWait("[CLASS:TLoginForm]", "", 10)

sleep(8000)

ControlSend($hWnd, "", "[CLASS:Internet Explorer_Server]", "Passw0rd")

sleep(1000)

ControlSend($hWnd, "", "[CLASS:Internet Explorer_Server]", "{TAB}")

sleep(1000)

ControlSend($hWnd, "", "[CLASS:Internet Explorer_Server]", "{Enter}")