ウィンドウ指定の方法

コマンド名の頭に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」を行うと、非表示のテキストは無視される。

Control系コマンドの「Control」引数

GUIコントロールを操作するControl系コマンドの引数には、先の4引数の前に「Control」という引数をとるものが多い。
この引数には、ClassNN(クラス名とインスタンス番号)もしくは、ボタンなどのテキストに含まれる文字列を指定する。
省略すると、一番前のコントロールが使用される。

Control系コマンドでのウィンドウハンドルの直接指定

「Control」引数があるコントロール操作系コマンドでは、WinTitleに「ahk_id %controlHWND%」というようにコントロールのウィンドウハンドルを指定し、Control引数を省略することで、ウィンドウハンドルで指定してコントロールを操作できる。
コントロールのウィンドウハンドルは、MouseGetPosWinGetControlGetコマンドや、DllCall()関数による各種APIの呼び出しによって取得できる。

ClassNNを用いたコントロールの指定では、クラス名が「SysListView」であるコントロールと「SysListView32」であるコントロールが存在し、「SysListView321」というClassNNが指定されたとき、「1番目のSysListView32」を指定したのか「321番目のSysListView」を指定したのかを見分けることができない。
このような問題があることから、ClassNNよりもウィンドウハンドルの直接指定を使用することが望ましい。
ClassNNよりもウィンドウハンドルの直接指定の方が、2倍程度高速に動作する。

ウィンドウクラスの指定

WinTitleを「ahk_class classname」のように指定すると、ウィンドウクラスがclassnameのウィンドウを指定することができる。
ウィンドウクラスは、WinGetClassで取得できるほか、付属のツールで調べることも可能。

ウィンドウハンドルの指定

WinTitleを「ahk_id 0x01234567」のように指定すると、ウィンドウハンドルが0x01234567のウィンドウを指定することができる。
ウィンドウハンドルは、WinGetコマンドで取得したものを使用できる。

ウィンドウ所有プロセスでの指定

WinTitleを「ahk_pid %pid%」のように指定すると、WinGetRunProcessコマンドで取得したプロセスID(PID)のプロセスが所有するウィンドを対象にできる。

ウィンドウグループの指定

WinTitleを「ahk_group GroupName」のように指定すると、GroupAddコマンドで作成したウィンドウグループに対して一括して操作を行うことができる。
WinMinimizeWinMaximizeWinRestoreWinHideWinShowWinCloseWinKillでは、すべてのウィンドウが操作される。
それ以外のコマンドでは、最も手前にあるウィンドウが対象となる。

複数の条件の同時指定

「%title% ahk_class %class% ahk_pid %pid%」のように半角スペースもしくはTab文字で区切って条件を列挙することで、ウィンドウタイトルやahk_class、ahk_pid、ahk_groupの条件を組み合わせて指定することができる。
ウィンドウタイトルの条件を指定する場合は、必ず一番最初に記述する。
スペースが二つ以上連続していると、最後のひとつ以外は直前の条件の一部であるとみなされる。

アクティブウィンドウの指定

WinTitleを「A」と指定し、残りの引数を省略すると、アクティブなウィンドウを指定することができる。
もしアクティブウィンドウが非表示で、DetectHiddenWindowsがOffだった場合、一致するウィンドウなしということになる。

複数ウィンドウがマッチした場合

WinTitle,WinText引数の指定にマッチするウィンドウが複数あった場合、一番手前のウィンドウが対象となる。

Last Found Window

IfWinExist, IfWinNotExist, IfWinActive, IfWinNotActive, WinWaitActive, WinWaitNotActive, WinWaitのコマンドで検出されたウィンドウは、Last Found Windowとして記録される。
WinTitle, WinText, ExcludeTitle, ExcludeTextを全て省略した場合、このウィンドウが対象となる。
これにより、いくつのもウィンドウ操作コマンドで同じ指定を繰り返す必要がなくなる。

この情報はスレッドごとに保持され、割り込みが発生しても書き変わることはない。

マウスカーソルの下のウィンドウ・コントロール

MouseGetPosを使えば、マウスの下のウィンドウハンドルとコントロールのClassNNを取得できる。

ウィンドウクラス名の調査

ウィンドウクラスやGUIコントロールのClassNNを調べたい場合、AutoHotkey同梱のAU3_Spy.exeを使用する。
起動して調べたいウィンドウをアクティブにすれば各種情報が表示される。
GUIコントロールのClassNNを調べたい場合は、当該コントロールの上にマウスカーソルを移動する。

>>>>>>>>>>>>( Window Title )<<<<<<<<<<<<<
デスクトップ
ahk_class ExploreWClass

>>>>>>>>>>>( Mouse Position )<<<<<<<<<<<<
On Screen:	x: 691	y: 545  (less often used)
In Window:	x: 307	y: 198

>>>>>>>>>>>>>( Pixel Color )<<<<<<<<<<<<<
10524816

>>>>>>>>>>>( Window Position )<<<<<<<<<<<
left: 384     top: 347     width: 800     height: 600

>>>>>>>>( Last Control Under Mouse )<<<<<<<
SysListView321

>>>>>>>>>( Status Bar Text )<<<<<<<<
(1): 
(2): 11.7 KB
(3): マイ コンピュータ

>>>>>>>>>>>( Visible Window Text )<<<<<<<<<
FolderView

>>>>>>>>>>( Hidden Window Text )<<<<<<<<<

>>>>>>>>>>>( TitleMatchMode=slow Visible Text )<<<<<<<<<
デスクトップ
デスクトップ

>>>>>>>>>>( TitleMatchMode=slow Hidden Text )<<<<<<<<<

AU3_Spy.exeを起動して他のウィンドウをアクティブにすると、上記のような内容が表示される。
3行目がウィンドウクラス、16行目がマウスの下のコントロールのClassNN。
Shift+Alt+TabでAU3_Spy.exeのウィンドウに切り替えると、ClassNNなどの情報が固定されるので範囲選択でコピーできる。

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