ここでは、AutoHotkeyで実現できる機能の一例を紹介する。
なお、例の中で自動操作などの対象となっているプログラムは、特に記述がない場合架空の物である。
リマップ機能を利用すれば、特定のキー操作に別のキーを割り当てることが出来る。
おおよそ全てのキーとマウスボタン、ジョイスティックのボタンの割り当てが可能である。
#h::left ;Win+Hに←キーを割り当て #j::down ;Win+Jに↓キーを割り当て #k::up ;Win+Kに↑キーを割り当て #l::right ;Win+Lに→キーを割り当て
#IfWinActive司令を使えば、特定の種類のウィンドウでのみキー割り当てを有効にすることが出来る。
ウィンドウの判別にはウィンドウタイトルやクラス名を使用できる。ウィンドウのクラス名は、付属のAU3_Spy.exeで調査できる。
RunコマンドとProcess,WaitCloseを使えば、スクリプト起動時に対象ソフトを起動し、対象ソフトが終了したらスクリプトも終了するというツールも実現できる。
Run,notepad.exe ;メモ帳を一つ起動 Process,WaitClose,notepad.exe ;メモ帳が全て終了するまで待機 ExitApp ;スクリプトを終了する #IfWinActive ahk_class Notepad ;メモ帳のウィンドウがアクティブの時のみ割り当てを行わせる ^r::^h ;Ctrl+RにCtrl+H(置換)を割り当て #IfWinActive ;ウィンドウの限定を解除
ホットキーにSendコマンドを割り当てることで、複雑な操作を1キーで済ませることができるようになる。
標準的なGUIアプリケーションなら、Alt+Tキーで「ツール(T)」のようなアクセスキーの割り当てられたメニュー項目を操作したり、Tabキーで入力欄の間をフォーカス移動するなど、キーの送信だけでもほとんどの操作が行えるようになっている。
なお、メニューの選択や入力欄への入力については、コントロール操作系コマンドで直接操作することも可能。こちらの方が高速かつ確実に動作するが、スクリプトを作成するのが多少面倒になる。
#IfWinActive ahk_class Notepad ;メモ帳のウィンドウがアクティブの時のみ割り当てを行わせる ^w::Send,!ow ;Alt+Oで「書式」メニューを表示し、「W」キーで「右端で折り返し」を選択 #IfWinActive ;ウィンドウの限定を解除
非アクティブのウィンドウや非表示のウィンドウにキー操作を送る機能を利用すれば、サウンドプレイヤーや常駐ソフトなどを好きなホットキーで直接操作できるようになる。
#n:: ;Win+nに割り当て DetectHiddenWindows,On ;非表示のウィンドウを対象に含めるようにする ControlSend,,^n,ahk_class SomeApplication ;対象ウィンドウにCtrl+Nキーを送信 return ;ホットキーサブルーチンを終了
Runコマンドでプログラムを起動することで、ランチャーを実現できる。
単にホットキーに割り当てれば、ホットキーランチャとして利用できる。
#1::Run,notepad.exe ;Win+1にメモ帳の起動を割り当て #2::Run,iexplore.exe ;Win+2にIEの起動を割り当て
プロセスが起動しているかどうかを調べる機能や、特定プロセスのウィンドウを操作する機能を使用すれば、既に起動しているプロセスをアクティブ化することが出来る。
複数プロセスを実行する必要がないのに重複起動防止機能がないソフトなどを使いやすくできる。
Process,Exist,notepad.exe ;メモ帳が起動しているかどうかを調べる If ErrorLevel<>0 ;起動していた場合(ErrorLevel変数にプロセスIDが格納される) WinActivate,ahk_pid %ErrorLevel% ;そのプロセスのウィンドウをアクティブにする else ;起動していなかった場合 Run,notepad.exe ;メモ帳を起動する
実行するファイルは相対パスで指定することも出来る。
リムーバブルメディア内のプログラムを起動するランチャを作りたいときなどに有効。
以下のスクリプトは、実行するとメニューでプログラムを一覧表示し、選択したプログラムを起動する。
常駐させて使用したい場合には、ホットキーなどに「Menu,M1,Show」の部分を割り当てればよい。
SetWorkingDir,%A_ScriptDir% ;相対パスの基準フォルダをスクリプトのあるフォルダに設定 Menu,M1,Add,.\apps\notepad\notepad.exe,Launch ;メニューにファイルを追加(同様に何行か書く) Menu,M1,Show ;メニューを表示 return ;終了 Launch: ;メニューが選択されたときにここから先が実行される Run,%A_ThisMenuItem% ;選択されたメニュー名をコマンドラインとして実行 return ;サブルーチンの終了
スクリプト中から環境変数を変更してプログラムを起動することが出来る。
システムの環境変数設定を変更せずに、設定に環境変数を使用するプログラムを利用したい場合などに役に立つ。
WindowsのBATファイルでも同等のことが出来るが、「A_ScriptDir」などの組み込み変数のおかげで記述が楽になっている。
EnvSet,USERPROFILE,%A_ScriptDir%\data ;設定の保存先となるUSERPROFILEのパスを変更 Run,%A_ScriptDir%\bin\someapp.exe ;プログラムを起動
ウィンドウの状態を判別する機能などを利用すれば、プログラムが処理を終えるのを待ってから続きを実行することも出来る。
Run,app01.exe ;一つめのプログラムを起動 WinWait,ahk_class app01wnd ;プログラムのウィンドウが表示されるまで待機 ControlSend,,{Tab}{Enter} ;そのウィンドウに処理を開始させるためのキー操作を送信 WinWait,完了 ;処理完了のメッセージが出るまで待機 WinClose ;そのウィンドウを閉じる WinClose,ahk_class app01wnd ;プログラムのウィンドウを閉じる Run,app02.exe ;2つめのプログラムを起動 ;以下、同様に作業を記述していく
ファイルLoopを使用すれば、フォルダ内のファイル全てに対して繰り返し同じ処理を行うことが出来る。
自動操作機能と組み合わせることで、GUIアプリケーションでの定型作業を効率化できる。
処理の途中でファイルの削除などの処理を行いたい場合、各種のファイル関連コマンドが利用できる。
Loop,D:\files\*.jpeg ;指定フォルダ内の全てのJPEGファイルについて処理 { ;繰り返しブロックの始まり Run,app.exe "%A_LoopFileLongPath%" ;対象ファイルを引数としてプログラムを起動 WinWait,ahk_class appwnd ;ウィンドウが表示されるまで待機 ControlClick,Button1 ;そのウィンドウのボタンをクリックする Loop{ ;処理が終わるまで繰り返し ControlGet,e,Enabled,,Button1 ;ボタンが使用禁止になっていないかを取得 If e=1 ;使用禁止でなければ、処理終了とみなす break ;繰り返しを終了する } WinClose ;ウィンドウを閉じる FileDelete,%A_LoopFileLongPath% ;対象ファイルを削除 }
画面上から特定の画像に一致する部分や、指定の色になっている部分を検索する機能を利用すれば、通常の方法では判別できない状態も判別できる場合がある。
ゲームなどの自動化に利用できる可能性があるが、入出力の実現方式が特殊なためAutoHotkeyでは操作できないソフトも少なくない。
Numpad0:: ;テンキーの「0」キーに割り当てる Send,{F1}{Enter} ;開始操作を実行 Loop{ ;条件を満たすまで繰り返し PixelSearch,,,0,0,100,100,0x0000FF,,RGB ;ウィンドウ左上100*100ピクセルの範囲に青色の部分があるかどうかを判別 if ErrorLevel=0 ;青色の部分が見つかったら break ;繰り返しを抜ける } Send,{Esc}{Esc} 終了操作を実行 return ;ホットキーサブルーチンを終了
Clipboard変数を利用すれば、簡単にクリップボード内の文字列データを操作できる。
Sendコマンドと組み合わせれば、ブラウザやエディタなどで選択された文字列を取得したり、キャレット位置に文字列を挿入したりすることも簡単にできる。
#g:: ;Win+Gキーに割り当て bk=%ClipboardAll% ;クリップボードの内容をバックアップ Clipboard= ;クリップボードをクリア Send,^c ;Ctrl+Cキーを送信 ClipWait ;クリップボードにテキストが格納されるまで待機 Run,http://www.google.com/search?q=%Clipboard% ;クリップボードの内容を検索するGoogleのURLを開く Clipboard=%bk% ;バックアップした内容を書き戻し return
OnClipboardChangeラベルを記述することで、クリップボードの内容が変更されたときに特定の処理が行われるようにすることが出来る。
#Persistent ;ホットキーなどを使用しない場合で、スクリプトを常駐させたいときに記述 OnClipboardChange: ;クリップボードの内容が変更されたときに実行されるラベル StringLeft,l,Clipboard,7 ;文字列の先頭7文字を切り出し StringRight,r,Clipboard,4 ;文字列の末尾4文字を切り出し if l=http:// ;先頭が「http://」で if r in jpeg,.jpg ;末尾が「jpeg」「.jpg」のどちらかなら Run,app.exe %Clipboard% ;そのURLを引数にプログラムを起動 return ;サブルーチンを終了
タイマー機能を利用することで、定期的に特定の処理を実行させられる。
単に特定の動作を定期実行したり、ウィンドウやプロセスなどの状態を監視して処理を実行したりといったことに利用できる。
#Persistent ;ホットキーなどを使用しない場合で、スクリプトを常駐させたいときに記述 SetTimer,OnTimer,1000 ;指定サブルーチンを1秒ごとに実行されるようにする return ;スクリプト起動時に実行される部分の終了 OnTimer: ;タイマーに割り当てられるサブルーチンラベル Process,Exist,app.exe ;指定プログラムが実行されているかを検出 If ErrorLevel=0 ;実行されていない場合 Run,app.exe ;再起動する return ;タイマーサブルーチンの終了
組み込み変数を使用すれば現在時刻などの情報も利用できる。
1秒ごとにサブルーチンを実行し、指定時刻を過ぎていたら処理を実行するというようなことも可能である。
#Persistent ;ホットキーなどを使用しない場合で、スクリプトを常駐させたいときに記述 time=%A_Now% ;現在時刻を取得 EnvAdd,time,30,Minutes ;時刻に30分加算 SetTimer,OnTimer,500 ;指定サブルーチンを0.5秒ごとに実行されるようにする return ;スクリプト起動時に実行される部分の終了 OnTimer: ;タイマーに割り当てられるサブルーチンラベル If A_Now>%time% ;現在時刻が指定時刻を過ぎたら MsgBox,30分経過 ;メッセージを表示 ExitApp ;スクリプトを終了
A_TimeIdlePhysical変数を使用することで、ユーザーが最後に何らかの操作を行ってから経過した時間を取得できる。
ユーザーが操作を行っていないときを見計らって処理を行うなどの機能が実現できる。
#Persistent ;ホットキーなどを使用しない場合で、スクリプトを常駐させたいときに記述 SetTimer,OnTimer,1000 ;指定サブルーチンを1秒ごとに実行されるようにする return ;スクリプト起動時に実行される部分の終了 OnTimer: ;タイマーに割り当てられるサブルーチンラベル If A_TimeIdlePhysical>60000 ;1分以上操作を行っていなければ { if flag<>1 ;実行されたかどうかのフラグが立っていなければ { Run,app.exe ;プログラムを実行 flag=1 ;フラグを立てる } }else{ ;最近1分以内に操作が行われた場合 flag=0 ;フラグを解除する } return ;タイマーサブルーチンの終了
OnExitコマンドでスクリプトが終了されるときに実行される処理を設定できる。
A_ExitReason変数で終了理由を判別すれば、Windowsがシャットダウンされようとしているときに特定の処理を実行させられる。
#Persistent ;ホットキーなどを使用しない場合で、スクリプトを常駐させたいときに記述 OnExit,WatchShutDown ;終了時に実行されるサブルーチンを割り当て return ;スクリプト起動時の処理を終了 WatchShutDown: ;終了時に実行されるサブルーチンラベル if A_ExitReason=ShutDown ;終了理由がWindowsのシャットダウンかどうかを判別 RunWait,app.exe ;プログラムを実行し、終了まで待機 ExitApp ;スクリプトを終了させる
サウンドを再生したり、音量の設定を変更したりする機能もある。
下記の例では、ホットキーで音量を調節するごとにWindows標準の通知音を再生している。
#up:: SoundSet,+10 SoundPlay,*64 return #down:: SoundSet,-10 SoundPlay,*64 return
Guiコマンドを使用することで、入力フォームを簡単に作成できる。
複雑なコマンドライン引数を入力しないと使用できないコンソールプログラムをGUIから簡単に使えるようになる
Gui,Add,Text,,対象ファイル ;ラベルを追加 Gui,Add,Edit,x100 yp+0 vTarget w400, ;入力欄を追加 Gui,Add,CheckBox,x100 vC1 w100,オプション&1 ;チェックボックスを追加 ;同様にオプションのチェックボックスを追加 Gui,Add,Button,gExec x400 yp+0,&OK ;実行ボタンを追加 Gui,Show ;ウィンドウを表示 return ;スクリプト起動時の処理を終了 Exec: ;実行ボタンに割り当てられるサブルーチン Gui,Submit,NoHide ;フォームの内容を変数に反映 cmd=app.exe "%Target%" ;基本となるコマンドラインを作成 if C1=1 ;チェックボックスがONだったら cmd=%cmd% /o ;コマンドラインオプションを追加 ;同様にチェックボックスの処理を記述 Run,%cmd% ;コマンドラインを実行 return GuiDropFiles: ;ウィンドウにファイルがドロップされたときに実行される StringSplit,fn,A_GuiEvent,`n ;ファイル名の一覧を一つずつに分割 GuiControl,,Target,%fn1% ;エディットボックスに一つめのファイル名を設定 return ;サブルーチンを終了
操作自動化機能を利用すれば、使用方法が面倒で分かりづらいGUIプログラムを簡単な操作で利用できるようにすることも出来る。
Gui,Add,Button,gB1,処理Aを実行 ;ボタン1を追加 ;同様にいくつかのボタンを追加 Gui,Show ;ウィンドウを表示 return ;スクリプト起動時の処理を終了 B1: ;ボタン1に割り当てたサブルーチンラベル Run,app.exe ;プログラムを起動 WinWait,ahk_class AppWnd ;ウィンドウが表示されるまで待機 ControlSend,,!eg!ef!x{Space}!o ;ややこしい操作を送信 ExitApp ;スクリプトを終了させる ;同様にいくつかのボタンに対応したサブルーチンを記述
Transformコマンドを使用することで、あらかじめ用意したテンプレートファイルに変数の内容を埋め込むことが出来る。
これを利用すれば、入力フォームに入力された内容を元に処理設定ファイルを作成してプログラムを起動すると言ったことも簡単に行える。
;GUI作成部分は省略。 Gui,Add,Button,gExec x400 yp+0,&OK ;実行ボタンを追加 Gui,Show ;ウィンドウを表示 return ;スクリプト起動時の処理を終了 Exec: ;実行ボタンに割り当てられるサブルーチン ;フォームの入力内容を元に、テンプレートに埋め込む文字列を生成する処理を記述 FileRead,template,%A_ScriptDir%\template.ini ;テンプレートファイルを読み込み Transform,inifile,Deref,%template% ;テンプレート内の変数参照を展開 FileDelete,%A_ScriptDir%\setting.ini ;既存のファイルを削除 FileAppend,%inifile%,%A_ScriptDir%\setting.ini ;内容をファイルに保存 Run,app.exe "/ini=%A_ScriptDir%\setting.ini ;プログラムを起動 return ;サブルーチンを終了
template.iniの内容は以下のような要領で記述する。
「%」で囲んで変数名を記述した部分が変数に格納された内容に置換される。
[General] TargetFile=%File% SearchStr=%SearchStr% IdleTime=%idle% #以下略