如何使用 AutoIt CLASS 匹配激活 Firefox

How to activate Firefox using AutoIt CLASS matching

使用 AutoIt v3,以下脚本应该激活 Firefox 网络浏览器 window:

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 activated",但 Firefox 并未实际激活。

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

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

使用 AutoIt Window Info 工具,似乎 Basic Window Info 被填充,但是 Basic Control 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 标题来控制 windows。这在这儿不可以吗?

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

Here 是如何通过 window 列表使用 class 来做到这一点的示例:

#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 实例可以有多个进程 基本 WinActivate([CLASS:MozillaWindowClass]) 请求会影响 Mozilla 的隐藏(默认)window。

您可以查看:

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

在我的例子中,它将是 PID 为 10128 的进程。