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