コマンド名の頭にWinもしくはControlと付くコマンドには、WinTitle, WinText, ExcludeTitle, ExcludeTextという引数をとるものが多い。
これらの指定方法は、おおむね全てのコマンドで同じなので、ここでまとめて説明する。
タイトルやテキストのチェックは、デフォルトで前方一致になっている。
「SetTitleMatchMode,2
」というコマンドで部分一致になる。
「SetTitleMatchMode,3
」で完全一致。
「DetectHiddenWindows,On
」を行わなければ、非表示のウィンドウは無視される。
ただし、後述のLastFoundWindowがAutoHotkeyのGuiウィンドウの場合、DetectHiddenWindowsがOffでも検出される。
「DetectHiddenText,Off
」を行うと、非表示のテキストは無視される。
GUIコントロールを操作するControl系コマンドの引数には、先の4引数の前に「Control」という引数をとるものが多い。
この引数には、ClassNN(クラス名とインスタンス番号)もしくは、ボタンなどのテキストに含まれる文字列を指定する。
省略すると、一番前のコントロールが使用される。
「Control」引数があるコントロール操作系コマンドでは、WinTitleに「ahk_id %controlHWND%」というようにコントロールのウィンドウハンドルを指定し、Control引数を省略することで、ウィンドウハンドルで指定してコントロールを操作できる。
コントロールのウィンドウハンドルは、MouseGetPos、WinGet、ControlGetコマンドや、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%
」のように指定すると、WinGet、Run、Processコマンドで取得したプロセスID(PID)のプロセスが所有するウィンドを対象にできる。
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を「A」と指定し、残りの引数を省略すると、アクティブなウィンドウを指定することができる。
もしアクティブウィンドウが非表示で、DetectHiddenWindowsがOffだった場合、一致するウィンドウなしということになる。
WinTitle,WinText引数の指定にマッチするウィンドウが複数あった場合、一番手前のウィンドウが対象となる。
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などの情報が固定されるので範囲選択でコピーできる。
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