Wie kann ich mit Autohotkey auf einen vorhandenen Google Chrome-Tab und nicht auf ein Containerfenster fokussieren?


16

Wie kann ich mit Autohotkey auf einen vorhandenen Google Chrome-Tab und nicht auf ein "Container" -Fenster fokussieren?

Einzelheiten

Google Chrome scheint jedes Fenster mit einem Containerfenster-Handle darzustellen, das eine oder mehrere Registerkarten enthält. Die Registerkarten (mindestens die aktuelle) haben ein eigenes Fensterhandle. Die Tab-Fenster-Handles haben Fenstertitel (die derzeit alle auf "- Google Chrome" enden), während das Container-Fenster-Handle dies nicht tut. Der folgende Autohotkey-Code funktioniert nicht wie für Google Chrome vorgesehen:

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

Diese Bindung konzentriert sich auf ein Google Chrome-Fenster, sofern es vorhanden ist, oder führt Google Chrome aus. Es wird jedoch häufig auf das Containerfenster abzielen (in Window Spy ist der Fenstertitel leer). Durch Aktivieren des Containerfensters wird die Verwendung von Google Chrome-Tastaturkürzeln verboten. Die Tastenkombinationen, auf die nicht zugegriffen werden kann, enthalten alle wichtigen Tastenkombinationen für den Zugriff auf das Omnibar. Da ich noch keine Möglichkeit gefunden habe, das Registerkartenfenster anstelle des Containerfensters durchgängig zu aktivieren, kann ich dieses Problem umgehen, indem ich die Maus verwende. Ich würde es jedoch vorziehen, dies nach Möglichkeit zu vermeiden.

Windows Spy Screenshots

Container Fenstergriff

Registerfenster-Handle

Hintergrund

Aktuelle Google Chrome-Version: 5.0.317.2 dev

Eine gebräuchliche Autohotkey-Bindung, die ich verwende, ist eine Tastenkombination, um eine bestimmte Anwendung zu fokussieren, wenn sie bereits ausgeführt wird, oder um die Anwendung auszuführen, wenn sie nicht ausgeführt wird.

Zum Beispiel verwende ich dies für foobar2000

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

Antworten:


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

Sollte den Trick machen

("Chrome_AutocompleteEditView1" ist der Name des Omnibar-Steuerelements, Sie können also hinzufügen Send ^a, um alle auszuwählen.)

Hinweis: Um die zu bekommen ahk_classfür Ihre Version von Chrome, zum Beispiel ahk_class Chrome_WindowImp1-0, verwenden Sie die im AU3_Spy.exeInnern des autohotkey Verzeichnisses. Auf diese Weise können Sie die richtige ahk-Klasse für Ihren Chrome-Browser finden, wenn das Beispiel nicht funktioniert.

Update: Ich kann nicht reproduzieren, vielleicht ist es mit einem anderen Steuerelement besser ... Um eine Liste der Steuerelemente eines Fensters zu erhalten, verwende ich diesen 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

So sind die Kontrollen meines Google Chrome 4.0.249.78 Beta (36714):

  • ViewsTextfieldEdit1
  • Chrome_RenderWidgetHostWND1
  • Chrome_AutocompleteEditView1
  • Chrome_WindowImpl_01
  • Chrome_WindowImpl_02

Vielen Dank. Dies scheint viel häufiger zu funktionieren als meine vorherige Funktion (ich musste ahk_class Chrome_WindowImpl_0 in ahk_class Chrome_WidgetWin_0 ändern, aber das kann nur an verschiedenen Versionen von Google Chrome liegen). Leider funktioniert es manchmal immer noch nicht und dieser Fall ist schwer zu reproduzieren. Sobald ich in ein Containerfenster gesperrt bin (siehe Screenshot im fraglichen Beitrag), muss ich immer noch auf die Maus zurückgreifen.
Vleeshue

Wie erhalte ich eine Liste der Google Chrome-Steuerelemente? Nachdem ich dies ein wenig benutzt habe, würde ich mich lieber auf das "Inhalts" -Fenster konzentrieren. Wenn der aktive Tab beispielsweise Google Reader oder Google Mail ist, möchte ich auf deren Tastaturkürzel zugreifen, die nur beim Fokussieren auf das Fenster "Inhalt" zutreffen. Darüber hinaus ermöglicht die Fokussierung auf das Fenster "Inhalt" eine schnellere Seitensuche. Um vom Inhaltsfenster zum Omnibar zu gelangen, kann ich auch immer Strg + l verwenden.
Vleeshue

1
Ja, es könnte besser sein mit einem anderen Steuerelement, siehe mein Update
Fluxtendu

Hmm ... ich bekomme: Chrome_WidgetWin_01, Chrome_WidgetWin_02, Chrome_RenderWidgetHostHWND1, ViewsTextfieldEdit1, Chrome_AutocompleteEditView1. Zeit, um herauszufinden, welche Kontrolle ich will. Vielen Dank! Update1: Einige schnelle Tests zeigen, dass Chrome_WidgetWin_01 das tut, was ich will. Ich vermute, die zusätzlichen werden basierend auf dem Seiteninhalt erzeugt. Update2: Ein Google Reader-Tab verfügt definitiv über mindestens ein Steuerelement mehr als dieser Superuser-Bearbeitungs-Tab.
Vleeshue

Leider stoße ich wieder auf das "Container" -Fenster (leerer Fenstertitel in Window Spy) und musste das akzeptierte Antwort-Tag rückgängig machen. Du warst aber eine große Hilfe.
Vleeshue

3

Problemumgehung mit 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

Passen Sie die Argumente nach Bedarf an. SetKeyDelay wird verwendet, weil das Senden zu schnell nicht funktioniert.


3

Möglicherweise möchten Sie eine Chrome-Erweiterung anstelle von AutoHotkey verwenden. Erweiterungen können auf alle geöffneten Registerkarten zugreifen, einschließlich der URL und der Möglichkeit, den Tabulatorfokus zu ändern. Andernfalls müssten Sie wahrscheinlich die Eingabehilfen in Chrome verwenden, um das aktive Fenster abzufragen. Ich glaube, so verfolgen Programme wie RescueTime die aktive URL. Wenn Sie beispielsweise den Accessible Event Watcher (AccEvent) aus dem Windows 7 SDK verwenden, werden beim Wechseln der Registerkarten in Chrome die folgenden Ereignisse angezeigt:

Google Chrome AccEvent


Davon wusste ich nichts. Danke für die Warnung.
Vleeshue

Es sieht so aus, als ob AutoHotkey Unterstützung für die Arbeit mit der iAccessible-Oberfläche bietet. Vielleicht möchten Sie dies versuchen und sehen, ob es hilft: autohotkey.com/forum/viewtopic.php?t=48629
Greg Bray

1

Wenn Sie einen Chrome-Tab suchen möchten, können Sie diesen verwenden

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

     .... do your stuff ... 

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

return

da in chrome alles ein prozess ist, sind deine tabs auch prozesse.


0

Window Spy gibt den Registerkartentitel im Feld "Sichtbarer Fenstertext" zurück.

Sie können die Registerkarten in einer Schleife durchlaufen, bis Sie den gewünschten Text gefunden haben. Senden Sie die Tasten CTRL+, um von Tab zu Tab zu wechseln TAB. Das Problem wäre, irgendwann anzuhalten, aber wenn Sie wissen, dass Sie nicht mehr als X Tabs verwenden, können Sie einen Zähler in die Schleife einfügen, um irgendwann abzubrechen, wenn der gewünschte Tab nicht gefunden wird.


Leider kann auch nicht auf Strg + Tab zugegriffen werden. Hier ist ein Screenshot von Fenster Spion auf einem Containerfenster und auf dieser Registerkarte als Referenz: img43.imageshack.us/img43/7341/containere.png img25.imageshack.us/img25/2651/tabw.png ich auch nur um sie zu der addierte Hauptfrage 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

2
Möchten Sie ein wenig erklären, was dies bewirkt?
Slhck

0

Prüfen Sie, ob dies hilfreich ist oder Ihnen weitere Ideen liefert. Ich verwende keine der oben genannten.

!z::
WinWait, Yahoo,
IfWinNotActive, Yahoo, , WinActivate,Yahoo,
WinWaitActive, Yahoo, 
Sleep, 100
return

1
Während dies die Frage beantworten mag, wäre es eine bessere Antwort, wenn Sie eine Erklärung dafür liefern könnten .
DavidPostill

0

Diese AHK-Funktion aktiviert einen Google Chrome-Tab, falls vorhanden, und gibt true zurück. Andernfalls wird false zurückgegeben.

; 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
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.