rcmdnk's blog

AutoHotkeyの基本的な使い方についてと、 自分が詰まったところについてのメモ。

取り敢えず、基本的なキー設定方法等。

Sponsored Links

設定ファイル

起動するとタスクバーにアイコンが出るので、右クリックからEdit This Script を選ぶと設定ファイルをメモ帳などで開いて編集できます。 設定ファイルはホームディレクトリ以下のDocuments\AutoHotkey.ahk 等になります。

または、別途設定ファイルを作り、AutoHotkeyで開けばそのファイルの設定を 使ってAutoHotkeyを起動します。

キー設定の基本

キーバインドは::を挟んで先に入力キー、右にアウトプットを書きます。 単独のキーバインドの場合は

a::b

この様に書けばaを押した時、bが出力されるようになります。 また、Sendコマンドを使って

a::Send,b

としても同じです。


厳密にはSendを使う場合とは一部違うところがあって、 a::bの様な単純な単項キー割り当てはRemap 1Sendや関数などを使ってコマンドを送る場合は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

の場合、ShiftCtrlを押している、押していないに関わらず 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-Tabbが送られますが、 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"){
    ...

それぞれ、実際には同時押しではなく、それぞれ、

  1. a
  2. b
  3. b
  4. 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の条件下ではbB単独、もしくはAB両方が有効な場合 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

のようにすると、小文字指定だけが有効化され、 abShift-aで大文字Bが出力されます。

一方、

a::Send,b
A::Send,c

と言った指定は、Duplication hotkeyエラーが出ます

Sponsored Links