Jak mogę użyć Autohotkey, aby skupić się na istniejącej karcie Google Chrome, a nie oknie „kontenera”?

16

Jak mogę użyć Autohotkey, aby skupić się na istniejącej karcie Google Chrome, a nie oknie „kontenera”?

Detale

Wydaje się, że Google Chrome reprezentuje każde okno za pomocą uchwytu okna kontenera, który zawiera jedną lub więcej kart. Zakładki (przynajmniej bieżąca) mają własny uchwyt okna. Uchwyty okien kart mają tytuły okien (które obecnie kończą się na „- Google Chrome”), natomiast sam uchwyt okna kontenera nie. Poniższy kod auto-klucza nie działa zgodnie z przeznaczeniem dla Google Chrome:

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

Wiązanie skupi się na oknie przeglądarki Google Chrome, jeśli istnieje lub będzie działać w przeglądarce Google Chrome. Jednak często będzie celować w okno kontenera (w Window Spy tytuł okna jest pusty). Aktywacja okna kontenera uniemożliwia korzystanie ze skrótów klawiaturowych Google Chrome. Niedostępne skróty klawiaturowe obejmują wszystkie ważne klawisze Ctrl + L, aby uzyskać dostęp do omnibara. Ponieważ nie znalazłem jeszcze sposobu, aby konsekwentnie aktywować okno kart zamiast okna kontenera, moim obejściem jest używanie myszy, ale wolałbym tego unikać, jeśli to możliwe.

Zrzuty ekranu szpiega okna

Uchwyt okna pojemnika

Uchwyt okna karty

tło

Aktualna wersja Google Chrome: 5.0.317.2 dev

Typowym powiązaniem autohotkey, którego używam, jest skrót klawiaturowy, aby skoncentrować konkretną aplikację, jeśli jest już uruchomiona, lub uruchomić aplikację, jeśli nie jest uruchomiona.

Na przykład używam tego dla foobar2000

^+m::
If WinExist("foobar2000")
    WinActivate
else
    Run "C:\Program Files (x86)\foobar2000\foobar2000.exe"
return
Vleeshue
źródło

Odpowiedzi:

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

Powinien załatwić sprawę

(„Chrome_AutocompleteEditView1” to nazwa kontrolki omnibar, więc możesz dodać, Send ^aaby zaznaczyć wszystkie)

Uwaga: aby uzyskać ahk_classwersję Chrome, np. ahk_class Chrome_WindowImp1-0Skorzystaj z AU3_Spy.exekatalogu automatycznego klucza. Pozwoli ci to znaleźć właściwą klasę ahk dla przeglądarki chrome, jeśli przykładowa nie działa.

Aktualizacja: Nie mogę się odtworzyć, może lepiej będzie z innym sterowaniem ... Aby mieć listę kontrolek okna używam tego kodu:

#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

Tak więc elementy sterujące mojej przeglądarki Google Chrome 4.0.249.78 beta (36714) to:

  • ViewsTextfieldEdit1
  • Chrome_RenderWidgetHostWND1
  • Chrome_AutocompleteEditView1
  • Chrome_WindowImpl_01
  • Chrome_WindowImpl_02
fluxtendu
źródło
Dziękuję Ci bardzo. Wydaje się, że działa to znacznie częściej niż moja poprzednia funkcja (musiałem zmienić ahk_class Chrome_WindowImpl_0 na ahk_class Chrome_WidgetWin_0, ale może to być spowodowane różnymi wersjami Google Chrome). Niestety, nadal nie działa przez pewien czas, a ten przypadek jest trudny do odtworzenia. Po zablokowaniu się w oknie pojemnika (patrz zrzut ekranu w pytaniu) nadal muszę korzystać z myszy.
vleeshue
Jak uzyskać listę kontrolek Google Chrome? Po odrobinie użycia wolałbym skupić się na oknie „zawartości”. Na przykład, jeśli aktywną kartą jest Czytnik Google lub Gmail, chciałbym uzyskać dostęp do ich skrótów klawiaturowych, które mają zastosowanie tylko podczas skupiania się na oknie „zawartości”. Ponadto skupienie się na oknie „zawartości” umożliwia szybsze wyszukiwanie strony. Ponadto, aby przejść do paska omnibar z okna „content”, zawsze mogę użyć ctrl + l.
vleeshue
1
Tak, może być lepiej z innym sterowaniem, zobacz moją aktualizację
fluxtendu
Hmm ... Dostaję: Chrome_WidgetWin_01, Chrome_WidgetWin_02, Chrome_RenderWidgetHostHWND1, ViewsTextfieldEdit1, Chrome_AutocompleteEditView1. Czas wydedukować, jakiej kontroli chcę. Dzięki! Aktualizacja 1: niektóre szybkie testy ujawniają, że Chrome_WidgetWin_01 robi to, co chcę. Sądzę, że dodatkowe są odradzane na podstawie zawartości strony. Aktualizacja 2: karta czytnika Google z pewnością ma co najmniej jedną kontrolę więcej niż karta edycji superużytkownika.
vleeshue
Niestety ponownie uruchamiam okno „kontenera” (tytuł pustego okna w oknie szpiegowskim) i musiałem cofnąć zaakceptowany tag odpowiedzi. Jesteś bardzo pomocny.
vleeshue
3

Obejście problemu za pomocą 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

Dostosuj argumenty zgodnie z potrzebami. Wykorzystano SetKeyDelay, ponieważ zbyt szybkie wysyłanie nie działa.

ftvs
źródło
3

Możesz skorzystać z rozszerzenia Chrome zamiast AutoHotkey. Rozszerzenia mogą uzyskać dostęp do wszystkich otwartych kart, w tym adresu URL i możliwości zmiany fokusu na karcie. W przeciwnym razie prawdopodobnie będziesz musiał skorzystać z funkcji ułatwień dostępu w Chrome, aby wysłać zapytanie do aktywnego okna. Uważam, że w ten sposób programy takie jak RescueTime śledzą aktywny adres URL. Na przykład użycie Kontrolera zdarzeń dostępnych (AccEvent) z zestawu SDK systemu Windows 7 pokazuje następujące zdarzenia podczas zmiany kart w Chrome:

Google Chrome AccEvent

Greg Bray
źródło
Nie wiedziałem o tym. Dzięki za heads-upy.
vleeshue
Wygląda na to, że AutoHotkey ma pewne wsparcie dla pracy z interfejsem iAccessible. Może chcę spróbować i sprawdzić, czy to pomaga: autohotkey.com/forum/viewtopic.php?t=48629
Greg Bray
1

jeśli chcesz znaleźć zakładkę chrome, możesz tego użyć

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

     .... do your stuff ... 

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

return

ponieważ w chrome wszystko jest procesem, twoje karty są również procesami.

acteon
źródło
0

Window Spy zwraca tytuł karty w polu „Widoczny tekst okna”.

Możesz zapętlać karty, aż znajdziesz żądany tekst. Aby przełączyć się z karty na kartę, wyślij klawisze CTRL+ TAB. Problemem byłoby zatrzymanie się w pewnym momencie, ale jeśli wiesz, że nie używasz więcej niż X zakładek, możesz dołączyć licznik do pętli, aby przerwać w pewnym momencie, jeśli żądana karta nie zostanie znaleziona.

Snark
źródło
Niestety, ctrl + tab jest również niedostępny. Oto zrzut ekranu szpiega okna w oknie kontenera i na tej karcie w celach informacyjnych: img43.imageshack.us/img43/7341/containere.png img25.imageshack.us/img25/2651/tabw.png Dodałem je również do główny post pytanie.
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
źródło
2
Chcesz wyjaśnić trochę, co to robi?
slhck
0

Sprawdź, czy to pomaga lub daje ci więcej pomysłów. Nie używam żadnego z powyższych.

!z::
WinWait, Yahoo,
IfWinNotActive, Yahoo, , WinActivate,Yahoo,
WinWaitActive, Yahoo, 
Sleep, 100
return
test
źródło
1
Chociaż może to odpowiedzieć na pytanie, lepszym rozwiązaniem byłoby wyjaśnienie, dlaczego tak się dzieje.
DavidPostill
0

Ta funkcja AHK aktywuje kartę Google Chrome, jeśli istnieje i zwraca wartość true. W przeciwnym razie zwróci false.

; 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
źródło