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
エラーが出ます