如何使用AutoIt CLASS匹配

时间:2017-08-24 02:20:22

标签: firefox automation ui-automation autoit

使用AutoIt v3,以下脚本应该激活Firefox Web浏览器窗口:

Opt("WinTitleMatchMode", 4)
$winMatchFirefox = "[CLASS:MozillaWindowClass]"

If WinExists($winMatchFirefox) Then
   Local $hWnd = WinActivate($winMatchFirefox)
   If 0 = $hWnd Then
      ToolTip("Firefox could not be activated", 100, 100, "Notice", 1)
   Else
      ToolTip("Firefox activated", 100, 100, "Notice", 1)
   EndIf
Else
   ToolTip("Firefox is not running", 100, 100, "Notice", 1)
EndIf
Sleep(3000)

以上脚本似乎有效。当Firefox运行时,输出甚至会显示“Firefox已激活”,但Firefox实际上并未激活。

将这些作为前两行交换,一切都突然按预期工作:

Opt("WinTitleMatchMode", 2)
$winMatchFirefox = " - Mozilla Firefox"

使用AutoIt窗口信息工具,似乎已填充基本窗口信息,但基本控制信息为空:

window info

有没有理由CLASS属性不起作用?以下代码段甚至出现在FireFox AutoIt library - FF.au3 (v0.6.0.1b-15)

Local $WINTITLE_MATCH_MODE = AutoItSetOption("WinTitleMatchMode", 4)
WinWaitActive("[CLASS:MozillaWindowClass]")
Sleep(500)
WinSetState("[CLASS:MozillaWindowClass]", "", @SW_MINIMIZE)
BlockInput(0)
AutoItSetOption("WinTitleMatchMode", $WINTITLE_MATCH_MODE)

这里发生了什么?通常更喜欢使用CLASS属性而不是Window标题来控制窗口。这不可能吗?

使用AutoIt v3.3.10.2和Firefox 52.0(32位)。

1 个答案:

答案 0 :(得分:4)

Here是如何通过窗口列表使用类来实现的:

#include <WinAPI.au3>
#include <Constants.au3>
#include <WindowsConstants.au3>
Local $hFireFoxWin=0,$aWinList=WinList("[REGEXPCLASS:Mozilla(UI)?WindowClass]")
For $i=1 To $aWinList[0][0]
    If BitAND(_WinAPI_GetWindowLong($aWinList[$i][1],$GWL_STYLE),$WS_POPUP)=0 Then
        $hFireFoxWin=$aWinList[$i][1]
        ExitLoop
    EndIf
Next
If $hFireFoxWin Then WinActivate($hFireFoxWin)

您还可以阅读Advanced Window Descriptions

您的尝试失败,因为Mozilla的一个实例可能有多个进程 mozilla_process 并且基本WinActivate([CLASS:MozillaWindowClass])请求会影响Mozilla的隐藏(默认)窗口。

您可以查看:

Opt("WinTitleMatchMode", 4)
$winMatchFirefox = "[CLASS:MozillaWindowClass]"
Local $hWnd = WinActivate($winMatchFirefox)
MsgBox(0,"", WinGetProcess("[ACTIVE]", ""))

在我的情况下,这将是PID 10128的过程。