如何使用 Autohotkey 聚焦现有的 Google Chrome 标签,而不是“容器”窗口?

如何使用 Autohotkey 聚焦现有的 Google Chrome 标签,而不是“容器”窗口?

如何使用 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。由于我尚未找到始终激活选项卡窗口而不是容器窗口的方法,因此我的解决方法是使用鼠标,但如果可能的话,我更愿意避免这样做。

Window Spy 截图

容器窗口句柄

选项卡窗口句柄

背景

当前 Google Chrome 版本:5.0.317.2 dev

我使用的常见自动热键绑定是键盘快捷键,如果特定应用程序已在运行,则聚焦该应用程序;如果特定应用程序未运行,则运行该应用程序。

例如,我将其用于 foobar2000

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

答案1

^+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.exeautohotkey 目录中的 。如果示例不起作用,这将允许您找到适合您的 Chrome 浏览器的正确 ahk 类。

更新:我无法重现,也许使用另一个控件会更好...要获得窗口控件列表,我使用以下代码:

#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 beta (36714) 的控件是:

  • 视图文本字段编辑1
  • Chrome_RenderWidgetHostWND1
  • Chrome_AutocompleteEditView1
  • Chrome_WindowImpl_01
  • Chrome_WindowImpl_02

答案2

您可能想考虑使用 Chrome 扩展程序而不是 AutoHotkey。扩展程序可以访问所有打开的选项卡,包括网址以及更改选项卡焦点的能力。否则,您可能需要使用无障碍设施Chrome 中的功能可以查询活动窗口。我相信这就是 RescueTime 等程序跟踪活动 URL 的方式。例如,使用 Windows 7 SDK 中的可访问事件观察器 (AccEvent) 在 Chrome 中更改选项卡时显示以下事件:

Google Chrome 帐户事件

答案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 是因为发送速度太快不起作用。

答案4

Window Spy 在“可见窗口文本”字段中返回选项卡标题。

您可以循环浏览标签,直到找到所需的文本。要从一个标签切换到另一个标签,请发送CTRL+TAB键。问题在于在某个时刻停止,但如果你知道最多使用不超过 X 个标签,则可以在循环中包含一个计数器,以便在未找到所需标签时在某个时刻中断。

相关内容