Как использовать Autohotkey, чтобы сосредоточиться на существующей вкладке Google Chrome, а не на окне «контейнера»?


16

Как использовать Autohotkey, чтобы сосредоточиться на существующей вкладке 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

Обычно я использую привязку autohotkey для быстрого доступа к конкретному приложению, если оно уже запущено, или для запуска приложения, если оно не запущено.

Например, я использую это для 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каталог autohotkey. Это позволит вам найти правильный класс 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. Время сделать вывод, какой контроль я хочу. Благодарность! Обновление 1: некоторое быстрое тестирование показывает, что Chrome_WidgetWin_01 делает то, что я хочу. Я предполагаю, что дополнительные появляются в зависимости от содержания страницы. Обновление 2: вкладка Google Reader определенно имеет по крайней мере еще один элемент управления, чем эта вкладка редактирования суперпользователя.
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. Например, при использовании Accessible Event Watcher (AccEvent) из Windows 7 SDK отображаются следующие события при смене вкладок в Chrome:

Google Chrome AccEvent


Я не знал об этом. Спасибо за внимание.
vleeshue

Похоже, что AutoHotkey имеет некоторую поддержку для работы с интерфейсом iAccessible. Возможно, стоит
Грег Брей,

1

если вы хотите найти вкладку Chrome, вы можете использовать это

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

     .... do your stuff ... 

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

return

поскольку в chrome все является процессом, ваши вкладки также являются процессами.


0

Window Spy возвращает заголовок вкладки в поле «Текст видимого окна».

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


К сожалению, Ctrl + Tab также недоступен. Вот скриншот окна шпиона в окне контейнера и на этой вкладке для справки: 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. В противном случае он вернет 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
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.