Comment puis-je utiliser Autohotkey pour se concentrer sur un onglet Google Chrome existant, pas sur une fenêtre "conteneur"?

16

Comment puis-je utiliser Autohotkey pour se concentrer sur un onglet Google Chrome existant, pas sur une fenêtre "conteneur"?

Détails

Google Chrome semble représenter chaque fenêtre avec une poignée de fenêtre de conteneur, qui contient un ou plusieurs onglets. Les onglets (au moins celui en cours) ont leur propre poignée de fenêtre. Les poignées de fenêtre d'onglet ont des titres de fenêtre (qui se terminent actuellement tous par "- Google Chrome"), contrairement à la poignée de fenêtre de conteneur elle-même. Le code de clé automatique suivant ne fonctionne pas comme prévu pour Google Chrome:

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

Cette liaison se concentrera sur une fenêtre Google Chrome si elle existe ou exécutera Google Chrome. Cependant, il ciblera souvent la fenêtre du conteneur (dans Window Spy, le titre de la fenêtre est vide). L'activation de la fenêtre de conteneur interdit l'utilisation des raccourcis clavier de Google Chrome. Les raccourcis clavier inaccessibles incluent le tout important ctrl + l pour accéder à l'omnibar. Comme je n'ai pas encore trouvé de moyen d'activer systématiquement la fenêtre d'onglet au lieu de la fenêtre de conteneur, ma solution consiste à utiliser la souris, mais je préférerais éviter cela si possible.

Captures d'écran de Windows Spy

Poignée de fenêtre de conteneur

Poignée de fenêtre à onglet

Contexte

Version actuelle de Google Chrome: 5.0.317.2 dev

Une liaison autohotkey courante que j'utilise est un raccourci clavier pour concentrer une application spécifique si elle est déjà en cours d'exécution ou pour exécuter l'application si elle ne fonctionne pas.

Par exemple, j'utilise ceci pour foobar2000

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

Réponses:

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

Devrait faire l'affaire

("Chrome_AutocompleteEditView1" est le nom du contrôle omnibar, vous pouvez donc l'ajouter Send ^apour tout sélectionner)

Remarque: Pour obtenir le ahk_classpour votre version de Chrome, par exemple ahk_class Chrome_WindowImp1-0, utilisez le AU3_Spy.exedans le répertoire autohotkey. Cela vous permettra de trouver la classe ahk correcte pour votre navigateur Chrome si l'exemple ne fonctionne pas.

Mise à jour: je ne peux pas reproduire, ce sera peut-être mieux avec un autre contrôle ... Pour avoir une liste de contrôles de fenêtre j'utilise ce code:

#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

Les commandes de mon google chrome 4.0.249.78 beta (36714) sont donc:

  • ViewsTextfieldEdit1
  • Chrome_RenderWidgetHostWND1
  • Chrome_AutocompleteEditView1
  • Chrome_WindowImpl_01
  • Chrome_WindowImpl_02
fluxtendu
la source
Merci beaucoup. Cela semble fonctionner beaucoup plus souvent que ma fonction précédente (a dû remplacer ahk_class Chrome_WindowImpl_0 par ahk_class Chrome_WidgetWin_0, mais cela peut être dû à différentes versions de Google Chrome). Malheureusement, cela ne fonctionne toujours pas parfois et ce cas est difficile à reproduire. Une fois que je me suis enfermé sur une fenêtre de conteneur (voir la capture d'écran dans le post de question), je dois encore recourir à la souris.
vleeshue
Comment puis-je obtenir une liste des contrôles Google Chrome? Après l'avoir utilisé un peu, je préférerais me concentrer sur la fenêtre "contenu". Par exemple, si l'onglet actif est Google Reader ou gmail, je voudrais accéder à leurs raccourcis clavier, qui ne s'appliquent que lorsque l'on se concentre sur la fenêtre "contenu". De plus, se concentrer sur la fenêtre "contenu" permet une recherche de page plus rapide. Aussi, pour accéder à l'omnibar depuis la fenêtre "contenu", je peux toujours utiliser ctrl + l.
vleeshue
1
Oui, cela pourrait être mieux avec un autre contrôle, voir ma mise à jour
fluxtendu
Hmm ... Je reçois: Chrome_WidgetWin_01, Chrome_WidgetWin_02, Chrome_RenderWidgetHostHWND1, ViewsTextfieldEdit1, Chrome_AutocompleteEditView1. Il est temps de déduire quel contrôle je veux. Merci! Update1: quelques tests rapides révèlent que Chrome_WidgetWin_01 fait ce que je veux. Je suppose que les autres sont générés en fonction du contenu de la page. Update2: un onglet google reader a définitivement au moins un contrôle de plus que cet onglet d'édition de superutilisateur.
vleeshue
Malheureusement, je suis à nouveau dans la fenêtre "conteneur" (titre de fenêtre vide dans spy fenêtre) et j'ai dû annuler le tag de réponse accepté. Vous avez cependant été d'une grande aide.
vleeshue
3

Solution de contournement en utilisant 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

Ajustez les arguments selon vos besoins. SetKeyDelay utilisé car l'envoi trop rapide ne fonctionne pas.

ftvs
la source
3

Vous voudrez peut-être envisager d'utiliser une extension Chrome au lieu d'AutoHotkey. Les extensions peuvent accéder à tous les onglets ouverts, y compris l' URL et la possibilité de changer le focus des onglets. Sinon, vous devrez probablement utiliser les fonctionnalités d' accessibilité de Chrome pour interroger la fenêtre active. Je pense que c'est ainsi que des programmes comme RescueTime suivent l'URL active. Par exemple, l'utilisation de l'Observateur d'événements accessible (AccEvent) du SDK Windows 7 affiche les événements suivants lors du changement d'onglets dans Chrome:

Google Chrome AccEvent

Greg Bray
la source
Je ne savais pas. Merci pour l'information.
vleeshue
Il semble qu'AutoHotkey ait un certain support pour travailler avec l'interface iAccessible. Pourrait essayer ceci et voir si cela aide: autohotkey.com/forum/viewtopic.php?t=48629
Greg Bray
1

si vous voulez trouver un onglet de chrome, vous pouvez l'utiliser

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

     .... do your stuff ... 

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

return

puisque dans Chrome tout est un processus, vos onglets sont également des processus.

acteon
la source
0

Window Spy renvoie le titre de l'onglet dans le champ "Visible Window Text".

Vous pouvez faire une boucle dans les onglets jusqu'à ce que vous trouviez le texte souhaité. Pour passer d'un onglet à l'autre, envoyez les touches CTRL+ TAB. Le problème serait de s'arrêter à un moment donné mais si vous savez que vous n'utilisez pas plus de X onglets au maximum, vous pouvez inclure un compteur dans la boucle pour rompre à un moment donné si l'onglet souhaité n'est pas trouvé.

Snark
la source
Malheureusement, ctrl + tab est également inaccessible. Voici une capture d'écran d'espion de fenêtre sur une fenêtre de conteneur et sur cet onglet pour référence: img43.imageshack.us/img43/7341/containere.png img25.imageshack.us/img25/2651/tabw.png Je viens également de les ajouter à la poste de question principale.
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
la source
2
Voulez-vous expliquer un peu ce que cela fait?
slhck
0

Voyez si cela vous aide ou vous donne plus d'idées. Je n'utilise aucun des éléments ci-dessus.

!z::
WinWait, Yahoo,
IfWinNotActive, Yahoo, , WinActivate,Yahoo,
WinWaitActive, Yahoo, 
Sleep, 100
return
tester
la source
1
Bien que cela puisse répondre à la question, ce serait une meilleure réponse si vous pouviez expliquer pourquoi .
DavidPostill
0

Cette fonction AHK active un onglet Google Chrome s'il existe et renvoie true. Sinon, il retournera faux.

; 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
la source