web-dev-qa-db-ja.com

Autohotkeyを使用して、「コンテナ」ウィンドウではなく、既存のGoogle Chrome=タブにフォーカスする方法を教えてください。

オートホットキーを使用して、「コンテナー」ウィンドウではなく、既存の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が含まれています。タブウィンドウを一貫してアクティブにする方法がまだ見つかっていないためコンテナーウィンドウの代わりに、私の回避策はマウスを使用することですが、可能であればそれを避けたいと思います。

ウィンドウスパイのスクリーンショット

Container Window Handle

Tab Window Handle

背景

現在のGoogle Chromeバージョン:5.0.317.2 dev

私が使用する一般的な自動ホットキーバインディングは、特定のアプリケーションが既に実行されている場合はそのアプリケーションに焦点を当て、実行されていない場合はそのアプリケーションを実行するためのキーボードショートカットです。

たとえば、これをfoobar2000に使用します

^+m::
If WinExist("foobar2000")
    WinActivate
else
    Run "C:\Program Files (x86)\foobar2000\foobar2000.exe"
return
17
vleeshue
^+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)のコントロールは次のとおりです。

  • ViewsTextfieldEdit1
  • Chrome_RenderWidgetHostWND1
  • Chrome_AutocompleteEditView1
  • Chrome_WindowImpl_01
  • Chrome_WindowImpl_02
6
fluxtendu

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
ftvs

AutoHotkeyの代わりにChrome拡張機能の使用を検討することもできます。拡張機能は、 [〜#〜] url [〜#〜] やタブフォーカスを変更する機能など、開いているすべてのタブにアクセスできます。それ以外の場合は、アクティブなウィンドウを照会するためにChromeの-​​ Accessibility 機能を使用する必要があるでしょう。 RescueTimeのようなプログラムがアクティブなURLを追跡する方法だと思います。たとえば、Windows 7 SDKのAccessible Event Watcher(AccEvent)を使用すると、Chromeでタブを変更するときに次のイベントが表示されます。

Google Chrome AccEvent

3
Greg Bray

chromeのタブを見つけたい場合は、これを使用できます

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

     .... do your stuff ... 

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

return

chromeはすべてプロセスなので、タブもプロセスです。

1
acteon
!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
Jackson

これがあなたに役立つか、より多くのアイデアを与えるかどうかを確認してください。上記のいずれも使用していません。

!z::
WinWait, Yahoo,
IfWinNotActive, Yahoo, , WinActivate,Yahoo,
WinWaitActive, Yahoo, 
Sleep, 100
return
0
test

この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
HaveSpacesuit

Window Spyは、「Visible Window Text」フィールドにタブタイトルを返します。

目的のテキストが見つかるまで、タブをループすることができます。タブを切り替えるには、 CTRL+TAB キー。問題はある時点で停止することですが、最大でX個を超えるタブを使用しないことがわかっている場合は、ループにカウンターを含めて、目的のタブが見つからない場合にどこかの時点で中断することができます。

0
Snark

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)
0
polyglot