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

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

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.


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


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.


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.


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

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

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
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.