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

16

Como posso usar a Autohotkey para focar em uma guia existente do Google Chrome, não em uma janela de "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) têm seu próprio identificador de janela. Os identificadores da janela da guia têm títulos de janela (que atualmente terminam em "- Google Chrome"), enquanto o identificador da janela do contêiner em si não. O código de autohotkey a seguir não funciona conforme o esperado 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

Essa ligação se concentrará em uma janela do Google Chrome, se ela existir ou executar o Google Chrome. No entanto, muitas vezes terá como alvo a janela do contêiner (no Window Spy, o título da janela está 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 ctrl + l mais importante para acessar o omnibar. Como ainda não encontrei uma maneira de ativar consistentemente a janela da guia em vez da janela do contêiner, minha solução alternativa é usar o mouse, mas prefiro evitar isso, se possível.

Espião janela Screenshots

Puxador de janela de contêiner

Identificador da janela da guia

fundo

Versão atual do Google Chrome: 5.0.317.2 dev

Uma ligação comum de autohotkey que eu uso é um atalho de teclado para focar um aplicativo específico se ele já estiver em execução ou para executar o aplicativo se 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
vleeshue
fonte

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 ^apara selecionar todos)

Nota: Para obter oahk_class sua versão do Chrome, por exemplo ahk_class Chrome_WindowImp1-0, use o AU3_Spy.exediretório interno do autohotkey. Isso permitirá que você encontre a classe ahk correta para o navegador Chrome, se o exemplo não funcionar.

Atualização: Não consigo reproduzir, talvez seja melhor com outro controle ... Para ter uma lista de controles de uma janela, 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

Portanto, 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
fluxtendu
fonte
Muito obrigado. Isso parece funcionar com muito mais frequência do que a minha função anterior (tive que alterar ahk_class Chrome_WindowImpl_0 para ahk_class Chrome_WidgetWin_0, mas isso pode ser devido a versões diferentes do Google Chrome). Infelizmente, ainda não funciona por algum tempo e esse caso é difícil de reproduzir. Uma vez bloqueado em uma janela de contêiner (veja a captura de tela na postagem da pergunta), ainda tenho que recorrer ao mouse.
vleeshue
Como obter uma lista dos controles do Google Chrome? Depois de usar isso um pouco, eu preferiria focar na janela "conteúdo". Por exemplo, se a guia ativa for o Google Reader ou o Gmail, eu gostaria de acessar seus atalhos de teclado, que só se aplicam ao focar na janela "conteúdo". Além disso, o foco na janela "conteúdo" permite uma pesquisa mais rápida na página. Além disso, para acessar o omnibar na janela "conteúdo", sempre posso usar ctrl + l.
vleeshue
11
Sim, poderia ser melhor com um outro controle, ver meu update
fluxtendu
Hmm ... eu recebo: Chrome_WidgetWin_01, Chrome_WidgetWin_02, Chrome_RenderWidgetHostHWND1, ViewsTextfieldEdit1, Chrome_AutocompleteEditView1. Hora de deduzir qual controle eu quero. Obrigado! Atualização1: alguns testes rápidos revelam que o Chrome_WidgetWin_01 faz o que eu quero. Meu palpite é que os adicionais são gerados com base no conteúdo da página. Atualização 2: uma guia do Google Reader definitivamente tem pelo menos mais um controle do que essa guia de edição de superusuário.
vleeshue
Infelizmente, estou novamente na janela "contêiner" (título da janela em branco no espião da janela) e precisei desfazer a etiqueta de resposta aceita. Você tem sido uma grande ajuda.
vleeshue
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.

ftvs
fonte
3

Você pode querer usar uma extensão do Chrome em vez do AutoHotkey. As extensões podem ter acesso a todas as guias abertas, incluindo o URL e a capacidade de alterar o foco da guia. Caso contrário, você provavelmente precisará usar os recursos de acessibilidade no Chrome para consultar a janela ativa. Acredito que é assim que programas como o RescueTime rastreiam qual é o URL ativo. Por exemplo, o uso do Observador de eventos acessível (AccEvent) no Windows 7 SDK mostra os seguintes eventos ao alterar as guias no Chrome:

AccEvent do Google Chrome

Greg Bray
fonte
Eu não sabia sobre isso. Obrigado pela atenção.
vleeshue
Parece que o AutoHotkey tem algum suporte para trabalhar com a interface iAccessible. Pode querer tentar isso e ver se isso ajuda: autohotkey.com/forum/viewtopic.php?t=48629
Greg Bray
1

se você quiser encontrar uma guia do chrome, você pode usar este

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

     .... do your stuff ... 

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

return

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

acteon
fonte
0

O Window Spy retorna o título da guia no campo "Visible Window Text".

Você pode fazer um loop nas guias até encontrar o texto desejado. Para alternar de tabulação para tab, envie as teclas CTRL+ TAB. O problema seria parar em algum momento, mas se você souber que não usa mais que X guias no máximo, poderá incluir um contador no loop para interromper em algum momento se a guia desejada não for encontrada.

Snark
fonte
Infelizmente, ctrl + tab também está inacessível. Aqui está uma captura de tela do espião de janela em uma janela de contêiner e nesta guia para referência: img43.imageshack.us/img43/7341/containere.png img25.imageshack.us/img25/2651/tabw.png Eu também as adicionei ao arquivo questão principal.
vleeshue
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
Jackson
fonte
2
Gostaria de explicar um pouco o que isso faz?
slhck 15/05
0

Veja se isso ajuda ou fornece mais idéias. Não estou usando nenhuma das opções acima.

!z::
WinWait, Yahoo,
IfWinNotActive, Yahoo, , WinActivate,Yahoo,
WinWaitActive, Yahoo, 
Sleep, 100
return
teste
fonte
11
Embora isso possa responder à pergunta, seria uma resposta melhor se você pudesse fornecer alguma explicação para isso.
DavidPostill
0

Esta função AHK ativará uma guia do Google Chrome, se existir, e retornará true. 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
}
HaveSpacesuit
fonte