AutoHotkeyの基本的な使い方についてと、 自分が詰まったところについてのメモ。
取り敢えず、基本的なキー設定方法等。
設定ファイル
起動するとタスクバーにアイコンが出るので、右クリックからEdit This Script を選ぶと設定ファイルをメモ帳などで開いて編集できます。 設定ファイルはホームディレクトリ以下のDocuments\AutoHotkey.ahk 等になります。
または、別途設定ファイルを作り、AutoHotkeyで開けばそのファイルの設定を 使ってAutoHotkeyを起動します。
キー設定の基本
キーバインドは::を挟んで先に入力キー、右にアウトプットを書きます。 単独のキーバインドの場合は
a::b
この様に書けばaを押した時、bが出力されるようになります。 また、Sendコマンドを使って
a::Send,b
としても同じです。
厳密にはSendを使う場合とは一部違うところがあって、 a::bの様な単純な単項キー割り当てはRemap 1、 Sendや関数などを使ってコマンドを送る場合はHotkey 2 と呼びます 3。
複数キーを出力したい場合はSendが必要です。
また、
a::b
と書いた場合、修飾キーがそのままbに渡される(下にあるワイルドカード状態?) 様になっている様です。
従って、Shift-aを押すと大文字のBが出ます。
一方、
a::Send,b
の場合、Shift-aは大文字のAを出力します。
特に意図しない限り、Sendで指定しておいた方が安全です。
また、下に書くように、大文字小文字でのケースで動きが違います。
コマンドに関しては
a::Send, b
a::Send b
の様に,を省略してスペースを入れても、またスペースを余分に入れても 同じです。
複数のキーをアウトプットとして使いたい場合は、 続けて書きます。
a::Send,Hello
とすれば、aを押した時Helloと出ます。 Sendコマンドは複数に分けて、
a::
Send,He
Send,llo
Return
と分けても可。
但し、この様に複数行に渡る場合、最後にReturn が必要です。 Returnを付けておかないと、次のキー設定も含んでしまいます。 つまり
a::
Send,b
Send,c
b::
Send,d
Return
とすると、bを押せばdが出るだけですが、aを押すと bcdが出力されます。
Space等はSpace、上下左右矢印などはUp/Down/Left/Rightなどで 4。 これらのキーはSendコマンドで送るときは{Space} など{}で囲う必要があります。
フック
a::Send,a
の様な設定をしてしまうと、出力のaをさらに解釈しようとして、無限ループに陥ってしまうことがあります。 これを避けるためには$を付けて
$a::Send,a
とすると、aをそのままaと解釈してaを出力します。また、
# UseHook
を宣言することで、それ以降全て$をつけているのと同じ状態になります 5 6 。 敢えて外す必要が無い限り、取り敢えずファイルの先頭で宣言しておくと良いです。
修飾キー、ワイルドカード、パススルー
修飾キー(モディファイヤー)の使い方がちょっと特殊で、以下の記号が 割り当てられていて、それらの記号との組み合わせで表現します 7。
- #: win
- !: alt
- ^: ctrl
-
+: shift
^a::!b
ならば、Ctrl-aを押したらAlt-b を出力します。 これらの記号は複数同時に付ける事が出来ます。
- *: ワイルドカード
また、特殊な記号として*をキーの前につけると修飾キーの 有り無しに関わらずキーが送られ、
*a::Send,b
の場合、ShiftやCtrlを押している、押していないに関わらず bが送られます。
- ~: パススルー
~を使うとそのキー自体はそのまま送られます。
~a::b
だと、abと出力されます。
複数キー同時押しに割り当て
上にある修飾キー以外にも、&を使うことで2つのキーを同時に押した時の 動作を設定できます。
&の両側にはスペースが必要です。
また、&を使うときは単純な
a & b::c
と言った設定は出来ず、
a & b::Send,c
とする必要があります。
さらに、&を使うときは修飾キーを使えません。
Ctrl-Shift-aを設定したいとき、
^+a::... OK
Ctrl & Shift & a::... No
Ctrl & +a::... No
Tabがちょっと思った通りに働かず、 修飾キーを2つ付けられません。
!+Tab::a
とした場合はAlt-Shift-Tabでは何も送信されません。
Alt & Tab::
If GetKeyState("Shift", "P"){
Send,a
}else
Send,b
}
Return
とした場合は、Alt-Tabでbが送られますが、 Alt-Shift-Tabでは何も送られません。
3つの同時押しは&では出来ませんが、GetKeyStateを使うことで設定出来ます。 GetKeyStateは
if GetKeyState("b","P")
...
等とするとbを押してある時、になるので他のキーとの同時押しの様に使えます。
ただし、以下のキー設定は全て違う部分があります。
;1,
a & b::...
;2,
b & a::...
;3,
a::
if GetKeyState("b", "P"){
...
;4,
b::
if GetKeyState("a", "P"){
...
それぞれ、実際には同時押しではなく、それぞれ、
- a
- b
- b
- a
が先に押されている必要があります。 1の場合はbが押された状態でaが押されるとbそのものが出ます。 3の場合にはa自体にキー設定をしているので、bが押されて居ない 場合を設定する必要が有ります。
a::
if GetKeyState("b","P"){
Send,c
}else{
Send,a
}
Return
この様にして、bが押されていればc、そうでなければaそのものを返す、 等。
GetKeyStateを使うことで、キーボードとOSがサポートする範囲で同時押しを いくつでも設定出来ます。
設定重複
AutoHotkeyでは、同じ条件下で同じキー設定があるとDuplication hotkeyエラーが出ます。 修飾キーが違ってたり同時押し設定などであればOK。
従って、
a::c
a & b::d
このような設定は可能ですが、この場合、 aだけを押すと、acが出ます。 設定順序が逆でも同じ。
また、ウィンドウ等、条件によって設定を使い分けることが出来ますが、
#If ; Without any condition
a::b
#If A
a::c
の様な設定があった場合、Aの条件下ではc、その他ではbが出ます。 これは順序を変更しても同じ。
この様に、片方が条件無し、だとAの条件下かどうかで順序に関係なく設定されます。
それ以外の場合で2つの条件が両方共とりうる場合、先に設定された方が優先されます。
#If A
a::b
#If A and B
a::d
#If B
a::c
この場合、Aの条件下ではb、B単独、もしくはAとB両方が有効な場合 dが出て、 最後のB単独の条件は無視されます。 これは、GetKeyStateを使った同時押しなどの場合も同じで 8、 基本的に先に設定されたものが優先されます。
コメント
コメントは各行で、;以降がコメントになります。 ;を使いたいときは ` がエスケープ文字なので、 これを付けて、
`;::a
等とエスケープする必要があります。
大文字小文字の区別
設定項目で、基本的に大文字、小文字は区別されないようです。
Send等もsendでOK。 また、Altを使いたい時もAltでもaltでも、さらにalTなどでも問題無いです。
また、変数や関数名も基本的にはどちらでも良いようです。
キー設定で
A::c
B::Send,d
とするとShift-aを押した時大文字でcが出ます。 また、この設定だけすると、a単独で押した場合が無効になります。
一方、bを押した場合、dが出力され、 Shift-bの場合には大文字のBが出力されます。 つまり、小文字のbで指定した場合と同じ働きになります。
a::b
A::c
のようにすると、小文字指定だけが有効化され、 aでb、Shift-aで大文字Bが出力されます。
一方、
a::Send,b
A::Send,c
と言った指定は、Duplication hotkeyエラーが出ます