オートホットキーを使用して、「コンテナ」ウィンドウではなく、既存のGoogle Chromeタブに焦点を合わせるにはどうすればよいですか?


16

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

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

回答:


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例えばクロム、のバージョンに、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ベータ版(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

1
はい、それは別のコントロールでより良いかもしれません、私の更新を参照してください
-fluxtendu

うーん...取得:Chrome_WidgetWin_01、Chrome_WidgetWin_02、Chrome_RenderWidgetHostHWND1、ViewsTextfieldEdit1、Chrome_AutocompleteEditView1。私が望むコントロールを推測する時間。ありがとう!Update1:​​いくつかの簡単なテストにより、Chrome_WidgetWin_01が私が望むことをしていることが明らかになりました。私の推測では、追加のものはページのコンテンツに基づいて生成されます。Update2:Googleリーダーのタブには、このスーパーユーザーの編集タブよりも少なくとも1つ以上のコントロールがあります。
vleeshue

残念ながら、私は再び「コンテナ」ウィンドウ(ウィンドウスパイの空白のウィンドウタイトル)にぶつかり、受け入れられた回答タグを元に戻す必要がありました。あなたはとても助かりました。
vleeshue

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

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

Google Chrome AccEvent


私はこれについて知りませんでした。ヘッドアップをありがとう。
-vleeshue

AutoHotkeyには、iAccessibleインターフェースを操作するためのサポートがあるようです。これを試して、それが役立つかどうかを確認してください:autohotkey.com/forum/viewtopic.php
グレッグブレイ

1

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

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

     .... do your stuff ... 

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

return

Chromeではすべてがプロセスであるため、タブもプロセスです。


0

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

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


残念ながら、ctrl + tabにもアクセスできません。ここでは、コンテナウィンドウ上および参照のためのこのタブのウィンドウのスパイのスクリーンショットです: img43.imageshack.us/img43/7341/containere.pngは img25.imageshack.us/img25/2651/tabw.png 私もちょうどにそれらを追加しました主な質問の投稿。
vleeshue


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
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.