Як я можу використовувати Автоматичну клавішу, щоб зосередити увагу на існуючій вкладці Google Chrome, а не на вікні "контейнера"?


16

Як я можу використовувати Автоматичну клавішу, щоб зосередити увагу на наявній вкладці Google Chrome, а не на вікні "контейнера"?

Деталі

Google Chrome, схоже, представляє кожне вікно з ручкою вікна контейнера, яка містить одну або кілька вкладок. Вкладки (принаймні поточні) мають власну віконну ручку. Ручки вікна вкладок мають заголовки вікон (які в даний час усі закінчуються на "- Google Chrome"), тоді як сама ручка вікна контейнера не відповідає. Наступний код автоматичної клавіші не працює, як призначено для Google Chrome:

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

Ця прив'язка буде зосереджена на вікні Google Chrome, якщо вона існує або запускається Google Chrome. Однак він часто орієнтується на вікно контейнера (у Window Spy заголовок вікна порожній). Активація вікна контейнера забороняє використання клавіш швидкого доступу Google Chrome. Недоступні комбінації клавіш містять усі важливі клавіші ctrl + l для доступу до універсального меню. Оскільки я ще не знайшов способу послідовної активації вікна вкладки замість вікна контейнера, моєму вирішенню є використання миші, але я вважаю за краще уникати цього, якщо це можливо.

Скріншоти віконного шпигуна

Ручка вікон контейнера

Ручка вікна вкладки

Фон

Поточна версія Google Chrome: 5.0.317.2 dev

Загальна прив'язка автоматичної клавіші, яку я використовую, - це комбінація клавіш для фокусування конкретної програми, якщо вона вже запущена, або для запуску програми, якщо вона не працює.

Наприклад, я використовую це для foobar2000

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

Відповіді:


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

Слід зробити трюк

("Chrome_AutocompleteEditView1" - це ім'я керування універсалом, тому ви можете додати, Send ^aщоб вибрати все)

Примітка. Щоб отримати ahk_classсвою версію Chrome, наприклад ahk_class Chrome_WindowImp1-0, скористайтеся AU3_Spy.exeвсередині каталогу автозапуску. Це дозволить вам знайти правильний клас ahk для вашого браузера Chrome, якщо приклад не працює.

Оновлення: я не можу відтворити, можливо, буде краще з іншим елементом управління ... Щоб мати список елементів керування вікном, я використовую цей код:

#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

Таким чином, елементи керування мого google chrome 4.0.249.78 бета (36714):

  • ViewsTextfieldEdit1
  • Chrome_RenderWidgetHostWND1
  • Chrome_AutocompleteEditView1
  • Chrome_WindowImpl_01
  • Chrome_WindowImpl_02

Велике спасибі. Це, здається, працює набагато частіше, ніж моя попередня функція (довелося змінити ahk_class Chrome_WindowImpl_0 на ahk_class Chrome_WidgetWin_0, але це може бути пов'язано з різними версіями Google Chrome). На жаль, він все ще не працює, а цей випадок важко відтворити. Як тільки я замикаюся на вікні контейнера (див. Скріншот у запитанні), я все-таки повинен вдатися до миші.
vleeshue

Як я можу отримати список елементів керування Google Chrome? Трохи використавши це, я вважаю за краще зосередитись на вікні "вмісту". Наприклад, якщо активною вкладкою є Google Reader або gmail, я хотів би отримати доступ до їхніх комбінацій клавіш, які застосовуються лише при фокусуванні на вікні "вмісту". Крім того, фокусування на вікні "вмісту" дозволяє швидше шукати сторінку. Крім того, щоб потрапити до багатоповерхового вікна з вікна "вмісту", я завжди можу використовувати ctrl + l.
vleeshue

1
Так, може бути краще з іншим
елементом

Хм ... я отримую: Chrome_WidgetWin_01, Chrome_WidgetWin_02, Chrome_RenderWidgetHostHWND1, ViewsTextfieldEdit1, Chrome_AutocompleteEditView1. Час вивести, який контроль я хочу. Спасибі! Update1: деяке швидке тестування виявляє, що Chrome_WidgetWin_01 робить те, що я хочу. Думаю, що додаткові породжуються залежно від вмісту сторінки. Update2: вкладка читача google безумовно має принаймні ще один контроль, ніж ця вкладка редагування суперпользователя.
vleeshue

На жаль, я знову запускаю у вікно "контейнер" (пустий заголовок вікна у вікні шпигуна) і мені довелося скасувати прийнятий тег відповідей. Хоча ти була чудовою допомогою.
vleeshue

3

Обхід за допомогою 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

Налаштуйте аргументи за потребою. SetKeyDelay використовується, оскільки надто швидке надсилання не працює.


3

Ви можете переглянути розширення Chrome замість AutoHotkey. Розширення можуть отримати доступ до всіх відкритих вкладок, включаючи URL-адресу та можливість змінити фокус вкладки. В іншому випадку вам, мабуть, потрібно буде скористатися функціями Accessibility у Chrome для запиту активного вікна. Я вважаю, що саме такі програми, як RescueTime, відстежують, що таке активна URL-адреса. Наприклад, за допомогою програми Watcher Event Access (AccEvent) з SDK Windows 7 показано такі події при зміні вкладок у Chrome:

Google Chrome AccEvent


Я про це не знав. Дякую за голову вгору
vleeshue

Схоже, що AutoHotkey має певну підтримку для роботи з інтерфейсом iAccessible. Ви можете спробувати це і побачити, чи допомагає це: autohotkey.com/forum/viewtopic.php?t=48629
Грег Брей

1

якщо ви хочете знайти вкладку хрому, ви можете скористатися цією

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

     .... do your stuff ... 

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

return

оскільки в хромі все це процес, ваші вкладки також є процесами.


0

Window Spy повертає заголовок вкладки у полі "Видимий текст вікна".

Ви можете зациклитися на вкладках, поки не знайдете потрібний текст. Щоб перейти з вкладки на вкладку, надішліть клавіші CTRL+ TAB. Проблема полягає в тому, щоб зупинитися в якийсь момент, але якщо ви знаєте, що не використовуєте більше ніж X вкладки, ви можете включити лічильник у цикл, щоб зламати в якийсь момент, якщо потрібна вкладка не знайдена.


На жаль, вкладка ctrl + також недоступна. Ось скріншот вікна-шпигуна на вікні контейнера та на цій вкладці для довідки: img43.imageshack.us/img43/7341/containere.png img25.imageshack.us/img25/2651/tabw.png Я також лише додав їх до контейнера основне запитання.
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
Хочете трохи пояснити, що це робить?
slhck

0

Подивіться, чи це допомагає чи дає вам більше ідей. Я не використовую нічого з перерахованого вище.

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

1
Хоча це може відповісти на питання, було б кращою відповіддю, якщо ви могли б дати пояснення, чому це так.
DavidPostill

0

Ця функція AHK активує вкладку Google Chrome, якщо вона існує, і поверне значення true. В іншому випадку воно повернеться помилковим.

; 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
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.