Bagaimana saya bisa menggunakan Autohotkey untuk fokus pada tab Google Chrome yang ada, bukan jendela "wadah"?

16

Bagaimana saya bisa menggunakan Autohotkey untuk fokus pada tab Google Chrome yang ada, bukan jendela "wadah"?

Detail

Google Chrome tampaknya mewakili setiap jendela dengan pegangan jendela kontainer, yang berisi satu atau lebih tab. Tab (setidaknya yang sekarang), memiliki pegangan jendela sendiri. Pegangan jendela tab memiliki judul jendela (yang saat ini semuanya diakhiri dengan "- Google Chrome"), sedangkan pegangan jendela wadah itu sendiri tidak. Kode autohotkey berikut tidak berfungsi seperti yang dimaksudkan untuk Google Chrome:

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

Ikatan ini akan fokus pada jendela Google Chrome jika ada atau akan menjalankan Google Chrome. Namun, sering akan menargetkan jendela kontainer (di Window Spy, judul jendela kosong). Mengaktifkan jendela kontainer melarang penggunaan pintasan keyboard Google Chrome. Pintasan keyboard yang tidak dapat diakses mencakup semua ctrl + l yang penting untuk mengakses omnibar. Karena saya belum menemukan cara untuk secara konsisten mengaktifkan jendela tab bukan jendela wadah, solusi saya adalah menggunakan mouse, tetapi saya lebih suka menghindari itu jika memungkinkan.

Screenshot Jendela Spy

Handle Jendela Kontainer

Pegangan Jendela Tab

Latar Belakang

Versi Google Chrome Saat Ini: 5.0.317.2 dev

Penjilidan autohotkey yang umum saya gunakan adalah pintasan keyboard untuk memfokuskan aplikasi tertentu jika sudah berjalan atau untuk menjalankan aplikasi jika tidak berjalan.

Sebagai contoh, saya menggunakan ini untuk foobar2000

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

Jawaban:

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

Sebaiknya lakukan triknya

("Chrome_AutocompleteEditView1" adalah nama kontrol omnibar, sehingga Anda dapat menambahkan Send ^auntuk memilih semua)

Catatan: Untuk mendapatkan ahk_classversi Chrome Anda, misalnya ahk_class Chrome_WindowImp1-0, gunakan bagian AU3_Spy.exedalam direktori autohotkey. Ini akan memungkinkan Anda untuk menemukan kelas ahk yang benar untuk browser chrome Anda jika contohnya tidak berfungsi.

Pembaruan: Saya tidak dapat mereproduksi, mungkin akan lebih baik dengan kontrol lain ... Untuk memiliki daftar kontrol jendela saya menggunakan kode ini:

#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

Jadi kontrol google chrome 4.0.249.78 beta saya (36714) adalah:

  • ViewsTextfieldEdit1
  • Chrome_RenderWidgetHostWND1
  • Chrome_AutocompleteEditView1
  • Chrome_WindowImpl_01
  • Chrome_WindowImpl_02
fluxtendu
sumber
Terima kasih banyak. Ini sepertinya berfungsi jauh lebih sering daripada fungsi saya sebelumnya (harus mengubah ahk_class Chrome_WindowImpl_0 menjadi ahk_class Chrome_WidgetWin_0, tetapi itu mungkin hanya karena versi Google Chrome yang berbeda). Sayangnya, itu masih tidak berfungsi beberapa waktu dan kasus itu sulit untuk direproduksi. Setelah saya dikunci ke jendela kontainer (lihat tangkapan layar di pos pertanyaan), saya harus tetap menggunakan mouse.
vleeshue
Bagaimana cara saya mendapatkan daftar kontrol Google Chrome? Setelah menggunakan ini sedikit, saya lebih suka fokus pada jendela "konten". Misalnya, jika tab aktif adalah Pustaka Google atau gmail, saya ingin mengakses pintasan keyboard mereka, yang hanya berlaku saat memfokuskan pada jendela "konten". Lebih jauh lagi, berfokus pada jendela "konten" memungkinkan pencarian halaman lebih cepat. Juga, untuk sampai ke omnibar dari jendela "konten", saya selalu dapat menggunakan ctrl + l.
vleeshue
1
Ya itu bisa lebih baik dengan kontrol lain, lihat pembaruan saya
fluxtendu
Hmm ... Saya dapat: Chrome_WidgetWin_01, Chrome_WidgetWin_02, Chrome_RenderWidgetHostHWND1, ViewsTextfieldEdit1, Chrome_AutocompleteEditView1. Waktu untuk menyimpulkan kontrol mana yang saya inginkan. Terima kasih! Pembaruan1: beberapa pengujian cepat mengungkapkan Chrome_WidgetWin_01 melakukan apa yang saya inginkan. Tebakan saya adalah tambahan yang dihasilkan berdasarkan konten halaman. Update2: tab google reader pasti memiliki setidaknya satu kontrol lebih dari tab edit pengguna super ini.
vleeshue
Sayangnya, saya berlari ke jendela "wadah" lagi (judul jendela kosong di jendela mata-mata) dan harus membatalkan tag jawaban yang diterima. Anda telah sangat membantu.
vleeshue
3

Penanganan masalah menggunakan 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

Sesuaikan argumen sesuai kebutuhan. SetKeyDelay digunakan karena mengirim terlalu cepat tidak berfungsi.

ftvs
sumber
3

Anda mungkin ingin melihat menggunakan ekstensi Chrome alih-alih AutoHotkey. Ekstensi dapat memperoleh akses ke semua tab yang terbuka, termasuk URL dan kemampuan untuk mengubah fokus tab. Kalau tidak, Anda mungkin perlu menggunakan fitur Aksesibilitas di Chrome untuk menanyakan jendela aktif. Saya percaya itulah cara program seperti RescueTime melacak apa URL aktif itu. Misalnya, menggunakan Pengakses Acara yang Dapat Diakses (AccEvent) dari Windows 7 SDK menunjukkan peristiwa berikut saat mengubah tab di Chrome:

Google Chrome AccEvent

Greg Bray
sumber
Saya tidak tahu tentang ini. Terimakasih atas peringatannya.
vleeshue
Sepertinya AutoHotkey memiliki beberapa dukungan untuk bekerja dengan antarmuka iAccessible. Mungkin ingin mencoba ini dan melihat apakah itu membantu: autohotkey.com/forum/viewtopic.php?t=48629
Greg Bray
1

jika Anda ingin menemukan tab chrome Anda dapat menggunakan ini

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

     .... do your stuff ... 

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

return

karena di chrome semuanya adalah proses, tab Anda juga proses.

akting
sumber
0

Window Spy mengembalikan judul tab di bidang "Visible Window Text".

Anda bisa mengulang di tab sampai Anda menemukan teks yang diinginkan. Untuk beralih dari tab ke tab, kirim tombol CTRL+ TAB. Masalahnya adalah berhenti di beberapa titik tetapi jika Anda tahu Anda tidak menggunakan lebih dari tab X paling banyak, Anda dapat menyertakan penghitung di loop untuk istirahat di beberapa titik jika tab yang diinginkan tidak ditemukan.

Snark
sumber
Sayangnya, tab ctrl + juga tidak dapat diakses. Berikut adalah screenshot dari mata-mata jendela pada jendela kontainer dan pada tab ini untuk referensi: img43.imageshack.us/img43/7341/containere.png img25.imageshack.us/img25/2651/tabw.png Saya juga baru saja menambahkannya ke posting pertanyaan utama.
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
sumber
2
Mau jelaskan sedikit apa fungsinya?
slhck
0

Lihat apakah ini membantu atau memberi Anda lebih banyak ide. Saya tidak menggunakan salah satu di atas.

!z::
WinWait, Yahoo,
IfWinNotActive, Yahoo, , WinActivate,Yahoo,
WinWaitActive, Yahoo, 
Sleep, 100
return
uji
sumber
1
Meskipun ini mungkin menjawab pertanyaan, itu akan menjadi jawaban yang lebih baik jika Anda bisa memberikan penjelasan mengapa itu bisa terjadi.
DavidPostill
0

Fungsi AHK ini akan mengaktifkan tab Google Chrome jika ada dan mengembalikan true. Kalau tidak, itu akan kembali salah.

; 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
sumber