ウィンドウ指定の方法
目次
概要[編集]
コマンド名の頭にWinもしくはControlと付くコマンドには、WinTitle, WinText, ExcludeTitle, ExcludeTextという引数をとるものが多い。
これらの指定方法は、おおむね全てのコマンドで同じなので、ここでまとめて説明する。
WinTitle | ウィンドウのタイトルバーなどのタイトルを指定する。 大文字小文字は区別される。他に、以降で説明するような指定が可能。 大抵の場合、残りの3引数は省略される。 |
WinText | ウィンドウ内に含まれるテキストで絞り込む。 |
ExcludeTitle | 無視するウィンドウのタイトルを指定する。 |
ExcludeText | 無視するウィンドウのテキストを指定する。 |
タイトルやテキストのチェックは、デフォルトでは前方一致になっている。
SetTitleMatchMode,2
というコマンドで部分一致になる。
SetTitleMatchMode,3
で完全一致。
SetTitleMatchMode,RegEx
では、正規表現による指定が可能。
DetectHiddenWindows,On
を行わなければ、非表示のウィンドウは無視される。
ただし、後述のLastFoundWindowがAutoHotkeyのGuiウィンドウの場合、DetectHiddenWindowsがOffでも検出される。
DetectHiddenText,Off
を行うと、非表示のテキストは無視される。
WinTitleの特殊な利用法[編集]
アクティブウィンドウの指定[編集]
WinTitleを「A
」の1文字だけにして残りの引数を省略すると、アクティブなウィンドウを指定することができる。
もしアクティブウィンドウが非表示で、DetectHiddenWindows
がOffだった場合、一致するウィンドウなしということになる。
ウィンドウクラスの指定[編集]
WinTitleを 「ahk_class classname
」のように指定すると、ウィンドウクラスが classname のウィンドウを指定することができる。
ウィンドウクラスは、WinGetClass で取得できるほか、付属のツールで調べることも可能。
ウィンドウハンドルの指定[編集]
WinTitleを 「ahk_id 0x01234567
」のように指定すると、ウィンドウハンドルが 0x01234567 のウィンドウを指定することができる。
ウィンドウハンドルは、WinGet コマンドで取得したものを使用できる。
ウィンドウ所有プロセスでの指定[編集]
WinTitleを「ahk_pid %pid%
」のように指定すると、WinGet、Run、Processコマンドで取得したプロセスID( pid )のプロセスが所有するウィンドを対象にできる。
プロセス名の指定[編集]
AHKL [v1.1.01+]: WinTitleを 「ahk_exe notepad.exe
」のように指定すると、プロセス名が notepad.exe のウィンドウを指定することができる。
大文字・小文字を区別せず名前かフルパスを指定する。
ウィンドウグループの指定[編集]
WinTitleを「ahk_group GroupName
」のように指定すると、GroupAddコマンドで作成したウィンドウグループに対して一括して操作を行うことができる。
WinMinimize、WinMaximize、WinRestore、WinHide、WinShow、WinClose、WinKillでは、すべてのウィンドウが操作される。それ以外のコマンドでは、最も手前にあるウィンドウが対象となる。
複数の条件の同時指定[編集]
「%title% ahk_class %class% ahk_pid %pid%
」のように半角スペースもしくはTab文字で区切って条件を列挙することで、ウィンドウタイトルやahk_class、ahk_pid、ahk_groupの条件を組み合わせて指定することができる。
ウィンドウタイトルの条件を指定する場合は、必ず一番最初に記述する。スペースが二つ以上連続していると、最後のひとつ以外は直前の条件の一部であるとみなされる。
複数ウィンドウがマッチした場合[編集]
WinTitle,WinText引数の指定にマッチするウィンドウが複数あった場合、一番手前のウィンドウが対象となる。
Control系コマンドの Control 引数[編集]
他ウィンドウやGUIウィンドウ内のコントロールを操作する Control
系コマンドの引数には、先の4引数の前に Control
という引数をとるものが多い。
この引数には、コントロール識別子(ClassNN) もしくは、ボタンなどのテキストに含まれる文字列を指定する。省略すると、一番前のコントロールが使用される。
コントロール識別子(ClassNN)[編集]
コントロール識別子(ClassNN)はウィンドウ内のコントロールを一意に識別するためのもので、「ウィンドウクラス+通番」というスタイルになっている。
Control系コマンドでのウィンドウハンドルの直接指定[編集]
Control
引数があるコントロール操作系コマンドでは、WinTitleに「 ahk_id %controlHWND%
」というようにコントロールのウィンドウハンドルを指定し、Control 引数を省略することで、ウィンドウハンドルで指定してコントロールを操作できる。
コントロールのウィンドウハンドルは、MouseGetPos、WinGet、ControlGet コマンドや、DllCall() 関数による各種APIの呼び出しによって取得できる。
ClassNNを用いたコントロールの指定では、クラス名が SysListView
であるコントロールと SysListView32
であるコントロールが存在し、 SysListView321
というClassNNが指定されたとき、 1番目のSysListView32
を指定したのか 321番目のSysListView
を指定したのかを見分けることができない。
このような問題があることから、ClassNNよりもウィンドウハンドルの直接指定を使用することが望ましい。ClassNNよりもウィンドウハンドルの直接指定の方が、2倍程度高速に動作する。
Last Found Window[編集]
IfWinExist, IfWinNotExist, IfWinActive, IfWinNotActive, WinWaitActive, WinWaitNotActive, WinWaitのコマンドで検出されたウィンドウは、Last Found Windowとして記録される。
WinTitle, WinText, ExcludeTitle, ExcludeTextを全て省略した場合、このウィンドウが対象となる。 これにより、いくつのもウィンドウ操作コマンドで同じ指定を繰り返す必要がなくなる。
この情報はスレッドごとに保持され、割り込みが発生しても書き変わることはない。
マウスカーソルの下のウィンドウ・コントロール[編集]
MouseGetPosを使えば、マウスの下のウィンドウハンドルとコントロールのClassNNを取得できる。
Window Spy を利用して調査を行う[編集]
ウィンドウクラスやGUIコントロールのClassNNを知りたい場合、AutoHotkey同梱の Window Spy で調査を行うことが出来る。 これを利用すると以下の情報を取得することが可能。
- ウィンドウタイトル
- ウィンドウクラス
- マウスカーソル座標(絶対/相対)
- マウス直下の色
- ウィンドウ位置とサイズ
- マウス直下のコントロール識別子( ClassNN )
- ステータスバーのテキスト
- ウィンドウ内の可視テキスト
- ウィンドウ内の不可視テキスト
Window Spy を起動するには、AutoHotkeyをインストールしたフォルダにある "AU3_Spy.exe" を直接実行するか、常駐しているAHKスクリプトのトレイアイコンのメニューから "Window Spy" を選択する。
Windos Spy を起動すると何も表示されていないウィンドウが出てくる。これはアクティブなウィンドウの情報を表示するためで正常な動作である。
このウィンドウは常に最前面になるので、邪魔にならない程度に移動・リサイズしてから、調べたいウィンドウをアクティブにする。
>>>>>>>>>>>>( Window Title )<<<<<<<<<<<<< |
すると上記のような内容が表示される。アクティブなウィンドウを切り替えたり、マウスカーソルを移動したりすると情報が逐一変更されていくのが分かる。
3行目がウィンドウクラス、16行目がマウスの下のコントロールのClassNN となっている。
必要な情報が表示されたら、Window Spy をアクティブ化してコピーを行う。 ただし [Shift]+[Alt]+[Tab] で切り替えをすること、さもないとマウスが移動している間にまた情報が変化してしまう。
Example[編集]
IfWinExist, Untitled - Notepad { WinActivate; Automatically uses the window found above.
WinMaximize; same
Send, Some text.{Enter} Return } IfWinNotExist, Calculator Return Else { WinActivate; The above "IfWinNotExist" also set the "last found" window for us.
WinMove, 40, 40; Move it to a new position.
Return }; Make a hotkey to maximize a window.
; Specify just "A" to make it operate on the active window:
^Up::WinMaximize, A