¿Cómo puedo usar Autohotkey para centrarme en una pestaña existente de Google Chrome, no en una ventana de "contenedor"?

16

¿Cómo puedo usar Autohotkey para enfocarme en una pestaña existente de Google Chrome, no en una ventana de "contenedor"?

Detalles

Google Chrome parece representar cada ventana con un asa de ventana de contenedor, que contiene una o más pestañas. Las pestañas (al menos la actual) tienen su propio identificador de ventana. Los identificadores de las ventanas de pestañas tienen títulos de ventana (que actualmente terminan en "- Google Chrome"), mientras que el identificador de la ventana del contenedor no. El siguiente código de autohotkey no funciona según lo previsto para Google Chrome:

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

Este enlace se centrará en una ventana de Google Chrome si existe o ejecutará Google Chrome. Sin embargo, a menudo apuntará a la ventana del contenedor (en Window Spy, el título de la ventana está en blanco). La activación de la ventana del contenedor no permite el uso de atajos de teclado de Google Chrome. Los atajos de teclado inaccesibles incluyen los más importantes ctrl + l para acceder al omnibar. Como todavía no he encontrado una manera de activar constantemente la ventana de pestañas en lugar de la ventana del contenedor, mi solución es usar el mouse, pero preferiría evitarlo si es posible.

Ventana espía Screenshots

Manija de ventana de contenedor

Tirador de ventana

Antecedentes

Versión actual de Google Chrome: 5.0.317.2 dev

Un enlace de autohotkey común que uso es un atajo de teclado para enfocar una aplicación específica si ya se está ejecutando o para ejecutar la aplicación si no se está ejecutando.

Por ejemplo, yo uso esto para foobar2000

^+m::
If WinExist("foobar2000")
    WinActivate
else
    Run "C:\Program Files (x86)\foobar2000\foobar2000.exe"
return
vleeshue
fuente

Respuestas:

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

Debería hacer el truco

("Chrome_AutocompleteEditView1" es el nombre del control omnibar, por lo que puede agregarlo Send ^apara seleccionar todo)

Nota: para obtener la ahk_classversión de Chrome, por ejemplo ahk_class Chrome_WindowImp1-0, utilice el AU3_Spy.exedirectorio de autohotkey. Esto le permitirá encontrar la clase ahk correcta para su navegador Chrome si el ejemplo no funciona.

Actualización: No puedo reproducir, tal vez sea mejor con otro control ... Para tener una lista de controles de ventana, 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

Entonces, los controles de mi google chrome 4.0.249.78 beta (36714) son:

  • ViewsTextfieldEdit1
  • Chrome_RenderWidgetHostWND1
  • Chrome_AutocompleteEditView1
  • Chrome_WindowImpl_01
  • Chrome_WindowImpl_02
fluxtendu
fuente
Muchas gracias. Esto parece funcionar mucho más a menudo que mi función anterior (tuve que cambiar ahk_class Chrome_WindowImpl_0 a ahk_class Chrome_WidgetWin_0, pero eso puede deberse a diferentes versiones de Google Chrome). Desafortunadamente, todavía no funciona algunas veces y ese caso es difícil de reproducir. Una vez que quede bloqueado en la ventana de un contenedor (vea la captura de pantalla en la publicación de preguntas), todavía tengo que recurrir al mouse.
vleeshue
¿Cómo obtendría una lista de los controles de Google Chrome? Después de usar esto un poco, preferiría centrarme en la ventana de "contenido". Por ejemplo, si la pestaña activa es Google Reader o gmail, me gustaría acceder a sus atajos de teclado, que solo se aplican cuando se enfoca en la ventana de "contenido". Además, centrarse en la ventana de "contenido" permite una búsqueda más rápida de la página. Además, para llegar al omnibar desde la ventana de "contenido", siempre puedo usar ctrl + l.
vleeshue
1
Sí, podría ser mejor con otro control, vea mi actualización
fluxtendu
Hmm ... obtengo: Chrome_WidgetWin_01, Chrome_WidgetWin_02, Chrome_RenderWidgetHostHWND1, ViewsTextfieldEdit1, Chrome_AutocompleteEditView1. Es hora de deducir qué control quiero. ¡Gracias! Actualización 1: algunas pruebas rápidas revelan que Chrome_WidgetWin_01 hace lo que quiero. Supongo que los adicionales se generan en función del contenido de la página. Actualización 2: una pestaña del lector de Google definitivamente tiene al menos un control más que esta pestaña de edición de superusuario.
vleeshue
Desafortunadamente, me encuentro nuevamente con la ventana "contenedor" (título de la ventana en blanco en la ventana espía) y tuve que deshacer la etiqueta de respuesta aceptada. Sin embargo, has sido de gran ayuda.
vleeshue
3

Solución 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 los argumentos según sea necesario. Se utiliza SetKeyDelay porque el envío demasiado rápido no funciona.

ftvs
fuente
3

Es posible que desee ver el uso de una extensión de Chrome en lugar de AutoHotkey. Las extensiones pueden obtener acceso a todas las pestañas abiertas, incluida la URL y la capacidad de cambiar el foco de las pestañas. De lo contrario, probablemente necesite usar las funciones de Accesibilidad en Chrome para consultar la ventana activa. Creo que así es como los programas como RescueTime rastrean cuál es la URL activa. Por ejemplo, el uso del Observador de eventos accesibles (AccEvent) del SDK de Windows 7 muestra los siguientes eventos al cambiar las pestañas en Chrome:

Google Chrome AccEvent

Greg Bray
fuente
Yo no sabía sobre esto. Gracias por el aviso.
vleeshue
Parece que AutoHotkey tiene algún soporte para trabajar con la interfaz iAccessible. Quizás quiera probar esto y ver si ayuda: autohotkey.com/forum/viewtopic.php?t=48629
Greg Bray
1

si quieres encontrar una pestaña de cromo puedes usar esto

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

     .... do your stuff ... 

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

return

Como en Chrome todo es un proceso, tus pestañas también son procesos.

acteon
fuente
0

Window Spy devuelve el título de la pestaña en el campo "Texto de ventana visible".

Puede recorrer las pestañas hasta que encuentre el texto deseado. Para cambiar de una pestaña a otra, envíe las teclas CTRL+ TAB. El problema sería detenerse en algún momento, pero si sabe que no usa más de X pestañas como máximo, puede incluir un contador en el bucle para romper en algún momento si no se encuentra la pestaña deseada.

Snark
fuente
Desafortunadamente, ctrl + tab también es inaccesible. Aquí hay una captura de pantalla de la ventana espía en la ventana de un contenedor y en esta pestaña para referencia: img43.imageshack.us/img43/7341/containere.png img25.imageshack.us/img25/2651/tabw.png También los agregué a pregunta principal post.
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
fuente
2
¿Te importaría explicar un poco qué hace esto?
slhck
0

Vea si esto le ayuda o le da más ideas. No estoy usando ninguno de los anteriores.

!z::
WinWait, Yahoo,
IfWinNotActive, Yahoo, , WinActivate,Yahoo,
WinWaitActive, Yahoo, 
Sleep, 100
return
prueba
fuente
1
Si bien esto puede responder la pregunta, sería una mejor respuesta si pudiera proporcionar alguna explicación de por qué lo hace.
DavidPostill
0

Esta función AHK activará una pestaña de Google Chrome si existe y devolverá verdadero. De lo contrario, devolverá 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
fuente