使用AHK检查浏览器中的所有选项卡

时间:2015-09-30 15:56:06

标签: autohotkey

我已准备好此代码

!^j::
    If WinExist("The Title")
        WinActivate
    else
        Run, https://webpage/index.php
Return

每当我点击热键时,如果想要的网页打开,则浏览器最大化。但是如果网页没有打开,我必须打开浏览器(如果浏览器已打开,则打开一个新的选项卡)并转到该页面。到目前为止一切似乎都很好,但有一个问题......

如果浏览器已打开,并且该页面也已打开但浏览器没有坐在该选项卡中程序会打开一个新选项卡,这意味着每次浏览器都在另一个选项卡中包含页面的那个查找,一个新的选项卡将打开,如何防止这个?

无论如何要解决它?像一个获取所有浏览器标签并进行循环的函数?

编辑:感谢@ Jsmith2800,现在我有了这段代码:

!^j::
    SetTitleMatchMode, 2
    WinActivate, - Mozilla Firefox
    SetTitleMatchMode, 1
    If WinExist("The Title")
        WinActivate
    else {
        winGetActiveTitle, Title
        loop{
            send ^{TAB}
            If WinExist("The Title")
                break
            If WinExist(Title)
                break
        }
        If WinExist(Title)
            Run, https://webpage/index.php
    }
Return

首先,我必须打开浏览器窗口,因此Ctrl + Tab实际上会更改选项卡。所以前三行是用于打开Mozilla Firefox。

然后我问我正在寻找的页面是否在当前标签中,如果是,则只激活该标签。但如果不是,则获取当前的标题并开始循环。

在该循环中,首先更改选项卡,然后再次询问新标签是否是我要查找的标签。如果新选项卡是那个,请中断循环并返回。如果没有,请在开始循环之前询问新选项卡是否相同,如果是,则不打开想要的页面,因此打开它并打破循环。

这是正常的,除了一件小事:标签以随机方式加入,因此有时它会在到达想要的页面之前返回Title页面怎么能我让它不是随意的。已经尝试SetWinDelay, 250,但没有用。

2 个答案:

答案 0 :(得分:1)

我没有很多使用Autohotkey的经验,但我发现this似乎它会覆盖你需要的东西,你需要将它与你已经拥有的一些部分结合起来,但如果我的理解是正确的,它应该看起来像这样。

If WinExist("The Title")
       WinActivate
    else {
        winGetActiveTitle, Title
            loop{ 
                send ^{TAB}
            if WinActive ("The Title")
                break
            if WinActive ("Title")
                break
                Run, https://webpage/index.php
            else
                continue
                }
            }

我不是百分之百,因为它看起来有点凌乱(在else语句中嵌套的if else语句)但是根据我的理解,这首先应该看看你正在寻找的标题是否存在,如果它确实很好,它将激活该页面。如果没有,它将进入下一个语句,它会将当前所选页面的标题记录为变量'Title',然后开始循环,它将发送键 ctrl + tab 移动到下一个选项卡,如果窗口标题现在等于您要查找的内容(在此示例中,显示为“标题”),它将停止循环。如果标题等于您在开始时记录的标题(即您已经循环所有打开的标签),它将打破循环,并打开您需要的页面。如果它不等于其中任何一个,它将重新启动循环并再次点击 Ctrl + tab ,再次检查标题等,直到满足上述2个标准之一

希望这会对你有所帮助,即使它只是链接到网站的信息,这对你有帮助,因为我说我不是最有经验的AHK用户所以不能保证我的建议会有用,还是祝你好运用它。

答案 1 :(得分:0)

好的,我解决了这个问题,感谢@ Jsmith2800让我头脑发热。 这是新代码

!^j::
SetTitleMatchMode, 2
WinActivate, - Mozilla Firefox
SetTitleMatchMode, 1
If WinExist("The Title")
    WinActivate
else {
    searchedTab := "The Title"
    WinGetActiveTitle, StartingTitle
    loop{
        send {Control down}{Tab}{Control Up}
        Sleep 400
        IfWinActive, %SearchedTab%
            Return
        WinGetActiveTitle, CurrentTabTitle
        If (CurrentTabTitle == StartingTitle)
            break
    }
    Run, https://webpage/index.php
}
Return

所以,快速解释一下解决方案。打开浏览器选项卡后,检查页面是否处于活动状态...进入循环时,我得到当前页面的标题。在循环内部,首先更改选项卡,然后睡眠.4秒,所以活动标签更改然后询问相同(如果页面需要,完成。如果没有,如果首页搜索,退出循环并运行想要的页面(如果没有,也可以工作)浏览器打开))。

基本上,问题是SetWinDelay没有按预期工作,将其替换为Sleep并完成。此外,如果浏览器未打开,则旧脚本无用。

我希望能够清楚地向所有需要它的人提供帮助。