如何使用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,用于访问多功能框。由于我还没有找到一种方法来一致地激活选项卡窗口而不是容器窗口,因此我的解决方法是使用鼠标,但如果可能的话,我宁愿避免这种情况。

窗口间谍Screenshots

集装箱窗把手

选项卡窗口句柄

背景

当前的Google Chrome版本:5.0.317.2 dev

我使用的一个常见的自动热键绑定是键盘快捷键,用于在特定应用程序已经运行时对其进行聚焦,或者在未运行时运行该应用程序。

例如,我将其用于foobar2000

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

Answers:


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.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)的控件是:

  • 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 2010年

1
是的,使用其他控件可能会更好,请参阅我的更新
fluxtendu 2010年

嗯...我得到:Chrome_WidgetWin_01,Chrome_WidgetWin_02,Chrome_RenderWidgetHostHWND1,ViewsTextfieldEdit1,Chrome_AutocompleteEditView1。是时候推断出我想要哪个控件了。谢谢!Update1:​​一些快速测试显示Chrome_WidgetWin_01可以满足我的要求。我的猜测是根据页面内容生成了其他内容。Update2:Google阅读器标签页肯定比该超级用户编辑标签页至少具有更多控制权。
vleeshue 2010年

不幸的是,我再次遇到“容器”窗口(窗口间谍中的空白窗口标题),不得不撤消接受的答案标签。您虽然提供了很大的帮助。
vleeshue 2010年

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和更改选项卡焦点的功能。否则,您可能需要使用Chrome中的辅助功能来查询活动窗口。我相信这就是RescueTime之类的程序如何跟踪活动URL的方式。例如,当在Chrome中更改选项卡时,使用Windows 7 SDK中的Accessible Event Watcher(AccEvent)显示以下事件:

Google Chrome AccEvent


我对此一无所知。感谢您的注意。
vleeshue 2010年

看起来AutoHotkey支持使用iAccessible界面。可能想尝试一下,看看是否有帮助:autohotkey.com/forum/viewtopic.php?t=48629
Greg Bray 2010年

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 2010年


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
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.