如何使用 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 的进程。
使用 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 的进程。