Como posso usar o Autohotkey para focar em uma guia existente do Google Chrome, não em uma janela de "contêiner"?

16

Como posso usar o Autohotkey para me concentrar em uma guia existente do Google Chrome, não em uma janela "contêiner"?

Detalhes

O Google Chrome parece representar cada janela com um identificador de janela de contêiner, que contém uma ou mais guias. As guias (pelo menos a atual), tem seu próprio identificador de janela. As alças da janela da guia têm títulos de janela (que atualmente todos terminam em "- Google Chrome"), enquanto o identificador da janela do contêiner não. O código autohotkey a seguir não funciona como pretendido para o Google Chrome:

^+i::
if WinExist("ahk_class Chrome_WidgetWin_0")
    WinActivate
else
    Run "C:\Users\vleeshue\AppData\Local\Google\Chrome\Application\chrome.exe"
return

Esta ligação incidirá sobre uma janela do Google Chrome, se existir ou irá executar o Google Chrome. No entanto, ele geralmente segmenta a janela do contêiner (no Window Spy, o título da janela fica em branco). Ativar a janela do contêiner não permite o uso de atalhos de teclado do Google Chrome. Os atalhos de teclado inacessíveis incluem o importantíssimo ctrl + l para acessar o omnibar. Como ainda não encontrei uma maneira de ativar consistentemente a janela de guias em vez da janela do contêiner, minha solução alternativa é usar o mouse, mas prefiro evitar isso, se possível.

Screenshots do Windows Spy

Plano de fundo

Versão atual do Google Chrome: 5.0.317.2 dev

Uma ligação autohotkey comum que uso é um atalho de teclado para focar um aplicativo específico, se ele já estiver em execução ou para executar o aplicativo, se ele não estiver em execução.

Por exemplo, eu uso isso para foobar2000

^+m::
If WinExist("foobar2000")
    WinActivate
else
    Run "C:\Program Files (x86)\foobar2000\foobar2000.exe"
return
    
por vleeshue 10.02.2010 / 00:20

9 respostas

5

^+i::
if WinExist("ahk_class Chrome_WindowImpl_0")
  {
  WinActivate
  ControlFocus, Chrome_AutocompleteEditView1
  }
else
  Run "C:\Users\vleeshue\AppData\Local\Google\Chrome\Application\chrome.exe"
return

Deve fazer o truque

("Chrome_AutocompleteEditView1" é o nome do controle omnibar, então você pode adicionar Send ^a para selecionar todos)

Nota: para obter o ahk_class da sua versão do Chrome, por exemplo, ahk_class Chrome_WindowImp1-0 , use o AU3_Spy.exe no diretório autohotkey. Isso permitirá que você encontre a classe ahk correta para o seu navegador chrome, caso o exemplo não funcione.

Atualização: não consigo reproduzir, talvez seja melhor com outro controle ... Para ter uma lista de controles de janela, eu uso este código:

#Persistent
SetTimer, WatchCursor, 100
return

WatchCursor:
  MouseGetPos, , , id, control
  WinGetTitle, title, ahk_id %id%
  WinGetClass, class, ahk_id %id%
  WinGet, ControlList, ControlList, A
  ToolTip, Under Cursor:'nahk_id: %id%'nahk_class: %class%'nTitle:%title%'nControl: %control%'n'nWindow Control List:'n%ControlList%
return

Assim, os controles do meu google chrome 4.0.249.78 beta (36714) são:

  • ViewsTextfieldEdit1
  • Chrome_RenderWidgetHostWND1
  • Chrome_AutocompleteEditView1
  • Chrome_WindowImpl_01
  • Chrome_WindowImpl_02
por 10.02.2010 / 20:15
3

Solução alternativa usando Alt + Tab:

; Activates the window identified with wintitle if it's active,
; else opens a new one
OpenWindow(wintitle, runCommand)
{
    if WinExist(wintitle)
        WinActivate ; activates the window found above. Sweet.
    else
        Run %runCommand%
}

#g::
AppsKey & g::
    prevKeyDelay := A_KeyDelay
    SetKeyDelay, 100
    OpenWindow("ahk_class Chrome_WidgetWin_0", A_AppData
                . "\Local\Google\Chrome\Application\chrome.exe")
    SendEvent {Alt down}{Tab}
    SendEvent +{Tab}
    SendEvent {Alt up}
    SetKeyDelay, prevKeyDelay
return

Ajuste os argumentos conforme necessário. SetKeyDelay usado porque o envio rápido demais não funciona.

    
por 30.08.2011 / 16:44
3

Você pode querer usar uma extensão do Google Chrome em vez do AutoHotkey. As extensões podem obter acesso a todas as guias abertas, incluindo o URL e a capacidade de alterar o foco da guia. Caso contrário, você provavelmente precisaria usar os recursos Acessibilidade no Chrome para consultar a janela ativa. Eu acredito que é assim que programas como o RescueTime rastreiam o que é o URL ativo. Por exemplo, o uso do Accessible Event Watcher (AccEvent) do Windows 7 SDK mostra os seguintes eventos ao alterar as guias no Chrome:

    
por 10.02.2010 / 18:49
1

se você quiser encontrar uma guia do chrome, use esta

SetTitleMatchMode, 2
If WinExist("your title ahk_exe chrome.exe")

     .... do your stuff ... 

else {
     .... do your other stuff ...
}

return

já que no chrome tudo é um processo, suas guias também são processos.

    
por 24.01.2014 / 15:42
0

Window Spy retorna o título da guia no campo "Texto da janela visível".

Você pode fazer um loop nas guias até encontrar o texto desejado. Para mudar de separador para separador, envie as teclas CTRL + TAB . O problema seria parar em algum momento, mas se você sabe que não usa mais de X abas no máximo, você pode incluir um contador no loop para quebrar em algum ponto se a aba desejada não for encontrada.

    
por 10.02.2010 / 19:14
0

Parece haver um bug com a função WinActivate no AutoHotkey. ( link )

Então, em vez da linha WinActivate, use

WinGet, winid, ID, 
DllCall("SwitchToThisWindow", "UInt", winid, "UInt", 1)
    
por 12.09.2010 / 23:34
0
!f::
    IfWinExist ahk_class Chrome_WidgetWin_0
    {   IfWinActive ahk_class Chrome_WidgetWin_0
        {   Loop, 60
            {   GetKeyState, state, C
                if state = D
                {   KeyWait, c

                    KeyWait, LAlt
                    Sleep 10

                    ;must send RCtrl!!!
                    Send {RCtrl down}
                    Send {w down}
                    Sleep 10
                    Send {w up}
                    Send {RCtrl up}

                    break
                }
                Sleep 1
            }

        }

        else
        {   KeyWait,f
            KeyWait,LAlt
            ;don't hijack other apps
            Send f
        }
    }

    return
    
por 15.05.2012 / 22:07
0

Veja se isso ajuda ou oferece mais ideias. Eu não estou usando nenhuma das opções acima.

!z::
WinWait, Yahoo,
IfWinNotActive, Yahoo, , WinActivate,Yahoo,
WinWaitActive, Yahoo, 
Sleep, 100
return
    
por 07.04.2016 / 18:34
0

Esta função AHK ativará uma guia do Google Chrome se ela existir e retornará verdadeira. Caso contrário, ele retornará falso.

; Activates tab in Google Chrome if it exists
; Returns true if exists, false if does not exist
; Leaves original tab activated if sought tab does not exist
; Known issue: will stop searching tabs if two tabs have same name
ActivateChromeTab(soughtTab)
{
  SetTitleMatchMode 2 ; Allows for partial matches in window titles

  IfWinNotExist Google Chrome
  {
    return false
  }

  WinActivate Google Chrome
  WinWaitActive Google Chrome
  WinGetTitle, currentTab, A
  firstTab := currentTab

  if (InStr(currentTab, soughtTab) > 0)
  {
    return true
  }

  Loop
  {
    Send {CtrlDown}{Tab}{CtrlUp}
    Sleep 50 ; Requires some time to update the window titles
    WinGetTitle, currentTab, A
    foundTab := InStr(currentTab, soughtTab) > 0
  }
  Until (foundTab || currentTab == firstTab)

  return foundTab
}
    
por 11.01.2018 / 22:35