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
とする必要があります。
さらに、&
を使うときは修飾キーを使えません。
また、3つ以上同時に使うことは出来ません。
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では何も送られません。
追記: 2017/09/03
何か勘違いしてたかもしくはAutoHotkeyのアップデートでfixしたか、 今やってみるとTabに対して複数の修飾キーを付けてもちゃんと動きます。
また、上のSendを送った例も動きます。
逆にTabを割り当てたい時、Alt-Tabなどは一度Altを離す様な動作があると 選択ウィンドウが消えてしまうため、 これを他のキーに上手く割り当てられる様に特別に AltTabやShiftAltTabという名前のキーが用意されています。
a::AltTab
みたいな感じで使えます。 ただし、これを使うときにはちょっと特殊な縛りがあり、 修飾キーを使う場合には必ず左か右か指定する必要があります。
LAlt & a::AltTab
<!a::AltTab
ここで一つ問題があって、上の&
を使った場合も
<
を使った場合も2つ以上修飾キーを付ける事が出来ません。
1 2 3 4 5 6 7 |
|
上の例に従ってこんな感じのを作ってみましたが 読み込んでもエラーは出ないもののCtrl-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::Send, d
このような設定は可能ですが、この場合、
aだけを押すと、c
が出ます。
設定順序が逆でも同じ。
また、ウィンドウ等、条件によって設定を使い分けることが出来ますが、
#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
エラーが出ます