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

9 ответов9

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" - это имя элемента управления omnibar, поэтому вы можете добавить 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
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

1

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

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

     .... do your stuff ... 

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

return

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

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
0

Посмотрите, поможет ли это или даст вам больше идей. Я не использую ничего из вышеперечисленного.

!z::
WinWait, Yahoo,
IfWinNotActive, Yahoo, , WinActivate,Yahoo,
WinWaitActive, Yahoo, 
Sleep, 100
return
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
}
0

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

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

0

Кажется, есть ошибка с функцией WinActivate в AutoHotkey. (http://productivegeek.com/forums/topic/autohotkey-problem-restoring-minimized-window-and-giving-keyboard-focus)

Поэтому вместо строки WinActivate используйте

WinGet, winid, ID, 
DllCall("SwitchToThisWindow", "UInt", winid, "UInt", 1)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .