オートホットキーを使用して、「コンテナー」ウィンドウではなく、既存のGoogle Chrome=タブにフォーカスする方法を教えてください。
詳細
Google Chromeは、1つ以上のタブを含むコンテナウィンドウハンドルで各ウィンドウを表すようです。タブ(少なくとも現在のタブ)には、独自のウィンドウハンドルがあります。タブウィンドウハンドルにはウィンドウのタイトル(現在はすべて「-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
^+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
を追加してすべてを選択できます)
注: Chromeのバージョン(ahk_class
など)のahk_class Chrome_WindowImp1-0
を取得するには、autohotkeyディレクトリ内のAU3_Spy.exe
を使用します。これにより、サンプルのブラウザが機能しない場合に、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)のコントロールは次のとおりです。
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を使用しました。
AutoHotkeyの代わりにChrome拡張機能の使用を検討することもできます。拡張機能は、 [〜#〜] url [〜#〜] やタブフォーカスを変更する機能など、開いているすべてのタブにアクセスできます。それ以外の場合は、アクティブなウィンドウを照会するためにChromeの- Accessibility 機能を使用する必要があるでしょう。 RescueTimeのようなプログラムがアクティブなURLを追跡する方法だと思います。たとえば、Windows 7 SDKのAccessible Event Watcher(AccEvent)を使用すると、Chromeでタブを変更するときに次のイベントが表示されます。
chromeのタブを見つけたい場合は、これを使用できます
SetTitleMatchMode, 2
If WinExist("your title ahk_exe chrome.exe")
.... do your stuff ...
else {
.... do your other stuff ...
}
return
chromeはすべてプロセスなので、タブもプロセスです。
!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
これがあなたに役立つか、より多くのアイデアを与えるかどうかを確認してください。上記のいずれも使用していません。
!z::
WinWait, Yahoo,
IfWinNotActive, Yahoo, , WinActivate,Yahoo,
WinWaitActive, Yahoo,
Sleep, 100
return
この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
}
Window Spyは、「Visible Window Text」フィールドにタブタイトルを返します。
目的のテキストが見つかるまで、タブをループすることができます。タブを切り替えるには、 CTRL+TAB キー。問題はある時点で停止することですが、最大でX個を超えるタブを使用しないことがわかっている場合は、ループにカウンターを含めて、目的のタブが見つからない場合にどこかの時点で中断することができます。
AutoHotkeyのWinActivate関数にバグがあるようです。 ( http://productivegeek.com/forums/topic/autohotkey-problem-restoring-minimized-window-and-giving-keyboard-focus )
したがって、WinActivate行の代わりに、
WinGet, winid, ID,
DllCall("SwitchToThisWindow", "UInt", winid, "UInt", 1)