Come posso usare Autohotkey per concentrarmi su una scheda Google Chrome esistente, non su una finestra "contenitore"?


16

Come posso utilizzare Autohotkey per concentrarmi su una scheda Google Chrome esistente, non su una finestra "contenitore"?

Dettagli

Google Chrome sembra rappresentare ogni finestra con un handle di finestra contenitore, che contiene una o più schede. Le schede (almeno quella corrente) hanno la propria maniglia della finestra. Gli handle della finestra della scheda hanno titoli di finestra (che attualmente terminano tutti con "- Google Chrome"), mentre l'handle della finestra del contenitore non lo è. Il seguente codice autohotkey non funziona come previsto per Google Chrome:

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

Questa associazione si concentrerà su una finestra di Google Chrome se esiste o eseguirà Google Chrome. Tuttavia, spesso prenderà di mira la finestra del contenitore (in Window Spy, il titolo della finestra è vuoto). L'attivazione della finestra del contenitore non consente l'utilizzo delle scorciatoie da tastiera di Google Chrome. Le scorciatoie da tastiera inaccessibili includono tutte le importanti ctrl + l per accedere a Omnibar. Dal momento che non ho ancora trovato un modo per attivare in modo coerente la finestra della scheda invece della finestra del contenitore, la mia soluzione è quella di utilizzare il mouse, ma preferirei evitarlo, se possibile.

Window Spy Immagini

Maniglia per finestra contenitore

Maniglia della finestra a schede

sfondo

Versione corrente di Google Chrome: 5.0.317.2 dev

Un'associazione di tasti di scelta rapida comune che uso è una scorciatoia da tastiera per focalizzare un'applicazione specifica se è già in esecuzione o per eseguire l'applicazione se non è in esecuzione.

Ad esempio, lo uso per foobar2000

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

Risposte:


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

Dovrebbe fare il trucco

("Chrome_AutocompleteEditView1" è il nome del controllo omnibar, quindi puoi aggiungere Send ^aper selezionare tutto)

Nota: per ottenere la ahk_classversione di Chrome in uso, ad esempio ahk_class Chrome_WindowImp1-0, utilizzare la AU3_Spy.exedirectory autohotkey all'interno. Ciò ti consentirà di trovare la classe ahk corretta per il tuo browser Chrome se l'esempio non funziona.

Aggiornamento: non riesco a riprodurre, forse sarà meglio con un altro controllo ... Per avere un elenco di controlli di una finestra io uso questo codice:

#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

Quindi i controlli del mio google chrome 4.0.249.78 beta (36714) sono:

  • ViewsTextfieldEdit1
  • Chrome_RenderWidgetHostWND1
  • Chrome_AutocompleteEditView1
  • Chrome_WindowImpl_01
  • Chrome_WindowImpl_02

Grazie mille. Questo sembra funzionare molto più spesso della mia funzione precedente (ho dovuto cambiare ahk_class Chrome_WindowImpl_0 in ahk_class Chrome_WidgetWin_0, ma ciò potrebbe essere dovuto alle diverse versioni di Google Chrome). Sfortunatamente, non funziona ancora qualche volta e quel caso è difficile da riprodurre. Una volta bloccato su una finestra del contenitore (vedi screenshot nel post delle domande), devo ancora ricorrere al mouse.
venerdì

Come posso ottenere un elenco di controlli di Google Chrome? Dopo averlo usato un po ', preferirei concentrarmi sulla finestra "contenuto". Ad esempio, se la scheda attiva è Google Reader o gmail, vorrei accedere alle loro scorciatoie da tastiera, che si applicano solo quando ci si concentra sulla finestra "contenuto". Inoltre, concentrarsi sulla finestra "contenuto" consente una ricerca più rapida delle pagine. Inoltre, per accedere a Omnibar dalla finestra "contenuto", posso sempre usare ctrl + l.
venerdì

1
Sì, potrebbe essere meglio con un altro controllo, vedi il mio aggiornamento
fluxtendu,

Hmm ... Ottengo: Chrome_WidgetWin_01, Chrome_WidgetWin_02, Chrome_RenderWidgetHostHWND1, ViewsTextfieldEdit1, Chrome_AutocompleteEditView1. È ora di dedurre quale controllo voglio. Grazie! Aggiornamento 1: alcuni test rapidi rivelano che Chrome_WidgetWin_01 fa quello che voglio. Suppongo che quelli aggiuntivi vengano generati in base al contenuto della pagina. Aggiornamento2: una scheda di Google Reader ha sicuramente almeno un controllo in più rispetto a questa scheda di modifica del superutente.
venerdì

Sfortunatamente, sto correndo di nuovo nella finestra "container" (titolo della finestra vuota nella spia della finestra) e ho dovuto annullare il tag di risposta accettato. Sei stato di grande aiuto però.
venerdì

3

Soluzione alternativa utilizzando 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

Modifica gli argomenti secondo necessità. SetKeyDelay utilizzato perché l'invio troppo veloce non funziona.


3

Potresti voler guardare usando un'estensione di Chrome invece di AutoHotkey. Le estensioni possono accedere a tutte le schede aperte, incluso l' URL e la possibilità di cambiare lo stato delle schede. Altrimenti probabilmente dovrai utilizzare le funzioni di accessibilità in Chrome per eseguire una query sulla finestra attiva. Credo che sia così che programmi come RescueTime tengono traccia dell'URL attivo. Ad esempio, l'utilizzo di Accessible Event Watcher (AccEvent) dall'SDK di Windows 7 mostra i seguenti eventi quando si cambiano le schede in Chrome:

Google Chrome AccEvent


Non lo sapevo. Grazie per il testa a testa.
venerdì

Sembra che AutoHotkey abbia qualche supporto per lavorare con l'interfaccia iAccessible. Potrei
Greg Bray,

1

se vuoi trovare una scheda di Chrome puoi usarla

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

     .... do your stuff ... 

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

return

poiché in Chrome tutto è un processo, anche le tue schede sono processi.


0

Window Spy restituisce il titolo della scheda nel campo "Testo finestra visibile".

È possibile eseguire il ciclo tra le schede fino a trovare il testo desiderato. Per passare da una scheda all'altra, invia i tasti CTRL+ TAB. Il problema sarebbe fermarsi ad un certo punto ma se sai di non usare più di X tab al massimo, puoi includere un contatore nel loop per spezzarlo ad un certo punto se la tab desiderata non viene trovata.


Sfortunatamente, anche ctrl + tab è inaccessibile. Ecco uno screenshot della spia della finestra su una finestra del contenitore e in questa scheda come riferimento: img43.imageshack.us/img43/7341/containere.png img25.imageshack.us/img25/2651/tabw.png Ho anche aggiunto loro alla post della domanda principale.
venerdì


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
Vuoi spiegare un po 'cosa fa?
slhck,

0

Vedi se questo ti aiuta o ti dà più idee. Non sto usando nessuno dei precedenti.

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

1
Sebbene ciò possa rispondere alla domanda, sarebbe una risposta migliore se tu potessi fornire qualche spiegazione sul perché lo faccia.
DavidPostill

0

Questa funzione AHK attiverà una scheda Google Chrome se esiste e restituirà true. Altrimenti, restituirà 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
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.